There are three kinds of automated software tests: Unit tests focus on a small unit of behavior, provide fast feedback and do that in isolation from other tests. Integration tests lack at least one of the mentioned properties of unit tests. Typically an integration test verifies the behavior of multiple modules together as well as their interaction with other processes like database management systems. Additionally it takes longer to execute and is more effort to develop than a unit test. End-to-end tests are special integration tests that verify the system from a user’s perspective including all external applications the system integrates with. End-to-end tests are hard to develop and maintain. Furthermore, they can take a very long time to execute and tend to be big in size. That leads to the metaphor of the ‘Testing Pyramid’: The base consists of a large number of unit tests. Then there is an intermediate layer of fewer integration tests and the top consists of even fewer end-to-end tests. Of course this is just a guideline. The concrete mix of tests depends on the kind of system you are developing.
