Dotychczas wszystko co dało się testować po klasie TestCase traktowałem jako test jednostkowy. Nie nieważne było jak bardzo złożona była ta testowana "jednostka". Czasem była prosta funkcja, a czasem klasa, która korzystała z wielu wcześniej stworzonych klas. Proste przypadki łatwo szło testowało, a te drugi już niezbyt i w związku z tym bardzo często korzystałem z mocków lub zmieniałem API po to, żeby dało się wstrzykiwać zależności.
Od tygodnia zorientowałem się, że źle rozumiem znaczenie testów jednosktowych. Sam test jednostkowy powinien testować tylko jednostkę w izolacji - czyli zdala od moich pozostałych klas.
Natomiast te drugie testy z którymi walczę do dziś to ponoć testy integracyjne. Fajną wieścią w ich przypadku jest to, że tutaj mogę sobie pozwolić na hity do bazy danych, czytanie z plików i łączenie z siecią, ponieważ wtedy nie muszę tak bardzo popadać w mockowanie.
Mimo, że celem tych testów jest sprawdzenie czy dobrze zintegrowałem ze sobą moje klasy to tak naprawdę nie wiem jak mam test prowadzić.
Przykładowo mam klasę Foo, korzysta ona z ustawień aplikacji i kilku innych dużo prostszych klas, które już wcześniej przetestowałem. Szansa, że ktoś użyje bezpośrednio klasę Foo jest moim zdaniem 100 razy większa w stosunku do tych prostych klas.
Pytanie więc jak to testować? Przecież jeżeli klasę Foo będę testował bardzo szczegółowo to cały test będzie mało czytelny, będzie cieżki w utrzymaniu i będzie posiadał wiele kopii testów, które już wcześniej stworzyłem dla testów jednostkowych.
Z drugiej strony jeśli tylko sprawdzę pozytywny przypadek testu jednostkowego to pojawia się pytanie, co z pozostałymi testami dla których spodziewam się wyniku pozytywnego. No i co z tymi przypadkami dla których oczekuje wykrycia negatywnych danych?