There are different types of testing you may encounter when designing or implementing a software system. Each of the classes serves a slightly different purpose. They can be categorized as follows:
- Unit testing: Code
- Integration testing: Design
- System testing: Requirements
- Acceptance testing (end-to-end or E2E): Client needs
This distinction is arbitrary and you may often see other layers of the pyramid, as follows:
- Unit testing
- Service testing
- UI testing (end-to-end or E2E)
Here, unit testing refers to the same layer as in the previous example. Service testing refers to a combination of integration testing and system testing. On the other hand, UI testing refers to acceptance testing. The following diagram shows the testing pyramid:

It's worth noting that unit tests are not only the cheapest to build but that they also execute pretty quickly and can often run in parallel. This means they make for a great continuous...