- Unit Testing, in which each unit (basic component) of the software is tested to verify that the detailed
design for the unit has been correctly implemented.
- Software Integration Testing, in which progressively larger groups of tested software components
corresponding to elements of the architectural design are integrated and tested until the software works as
- System Testing, in which the software is integrated to the overall product and tested to show that all
requirements are met.
A further level of testing is also concerned with requirements:
Acceptance Testing, upon which acceptance of the completed software is based. This will often use a subset of the system tests, witnessed by the customers for the software or system.
Once each level of software specification has been written, the next step is to design the tests. An important point here is that the tests should be designed before the software is implemented, because if the software was implemented first it would be too tempting to test the software against what it is observed to do (which is not really testing at all), rather than against what it is specified to do.
Testing does not end following the conclusion of acceptance testing. Software has to be maintained to fix problems which show up during use and to accommodate new requirements. Software tests have to be repeated, modified and extended. The effort to revise and repeat tests consequently forms a major part of the overall cost of developing and maintaining software. The term regression testing is used to refer to the repetition of earlier successful tests in order to make sure that changes to the software have not introduced side effects.