Software testing verifies that the completed software module fulfills the stated requirements.
It is impossible to test for all possible combinations of inputs. As an example, if you input two 16-bit integers into an embedded system, this gives 2^32 different combinations. If you were able to test 100,000 combinations each second, it would still take over 5 million years to cycle through all of them.
Thus, the objective is not to find every software bug that exists, but to uncover situations that could negatively impact the customer, usability, and/or maintainability.
Software testing and integration are always linked, since integration time is where a large number of software errors are found.
Different types of testing exist:
- Functional Testing
Verifies that software unit performs as expected according to the stated requirements. - Parametric Testing
Testing for the full range of valid input parameters (and a representative sample of combinations of these). - Fault Tolerant Testing
This checks that the software functions together in a graceful manner according to the requirements when presented with unexpected and/or out-of-range values. - Integration Testing
This checks that the parameters passed between sub-systems are being handled correctly. - Regression Testing
This involves retesting sub-systems/modules/units to ensure that modifications to one sub-system/module/unit does not cause unexpected results in another sub-system/module/unit.