Here and Here I explained why I think that unit tests alone or integration tests alone does not do a good enough job at assuring the quality of the product. However, that combining the two test levels, i.e. investing some of the effort in integration tests and in unit tests is what I call a winning solution.
Investing effort on both levels allow one to benefit from both worlds
on one side integration test will help in:
- formulizing the user requirements.
- make sure that system is working end to end.
- test non functional requirements
on the other side unit tests will help in:
- driving the design of the system to a better one.
- give a good coverage of all parts of the system
- eliminating defects that get shipped with the system.
I have been suing this approach in a TDD style in which the development process of a new feature(user story) started out by writing a few (failing) integration tests then followed by writing some more (failing) unit tests and only then starting to implement. this kind of process has worked for us.
The million dollar question is of course “how much do invest at each level?”, and the real answer is I don’t know. I think that it really depends on the specifics of the project and the system under test. In some cases it makes more sense to invest more time on the unit level while in other its better to spend more effort on the integration level. I really think that the best guide to that will be to use common sense and see how things works out.