Software testing can be divided into the following phases:
I) Unit Testing: This phase of software testing is performed to verify the functionality and behavior of independent modules or units. Designers or developers may write such tests before code is committed to the version control repository (e.g., application programming interface, classes). The purpose of this phase is to find as many bugs as possible before the code becomes too complex.
II) Integration Testing: This software testing phase includes testing individual units (or modules) and their interfaces with other units within the same system. This applies to horizontal or parallel interfaces such as data entry between two modules and vertical or hierarchical interfaces such as output from a module or the input to another.
The purpose of this phase may be to verify module inter-operability, verify compliance with user requirements and acceptance criteria, and identify any incompatibilities that arise between different modules caused by modular programming practices.
III) System Testing: It is performed after all individual components have been integrated and check the interaction of all parts of the system. This phase may include functional testing and stress testing and serves as an acceptance test for the system as a whole.
IV) User Acceptance Testing: A type of black-box testing where software is tested by users or their surrogates (such as business, quality assurance, or technical staff) against their expected requirements to detect usability problems and other errors.
V) Regression Testing: This phase of software testing is performed to identify software regressions - that is, bugs that were previously fixed have now been reintroduced into the system.