After a recent project meeting, I realised that the participants had differing interpretations of what is involved in each phase of testing. I compiled the definitions below to ensure the team are aligned.
A Unit Test is a test that ensures that a single class or routine does what it is meant to without needing to cross class or system boundaries in order to execute. This can be represented using the ACID acronym:
Atomic
Consistent
Isolated
Durable
- A test that verifies multiple pieces of functionality is not atomic.
- A test that changes results based on external factors (such as user interaction) is not consistent.
- A test that accesses a database, file system or interacts with other classes is not isolated. Neither are tests that need to be run in a specific order.
- A test that fails when specific data isn't available or breaks when other classes in the application change (not including the class under test) is not durable.
Integration Testing is the combined execution of two or more classes or components. Integration testing can start as soon as there are two classes to test and should continue until the entire system is complete.
Regression Testing is the repetition of previously executed test cases for the purpose of finding defects that previously passed the same set of tests.
System Testing is the execution of the software in its final configuration, including integration with other software and hardware systems. It tests for security, performance, resource loss, timing problems, and other issues that can't be tested at lower levels of integration.
Acceptance Testing is confirmation by a key user, through trial or review, that the software meets mutually agreed-upon requirements.
Load Testing is the execution of the software with varying levels of throughput to determine at what point the response time degrades or fails.
Recovery testing is the process of testing how well a system can be recovered following a hardware failure or other catastrophic problem.