Pracowałem tak, jak ty. I nie powiem ci, że nie możesz. Ostrzegam cię przed czymś, na co możesz natknąć się.
Kiedy każdy test jednostkowy jest po prostu modernizacją, trudno jest nauczyć się, jak je uelastyczniać. Zwykle są niczym więcej niż testami regresji. Ponieważ nigdy nie używałeś ich do refaktoryzacji, bardzo łatwo jest napisać testy, które faktycznie utrudniają refaktoryzację. To wymyka się spod kontroli, dopóki nie stracisz wszelkiej wiary w TDD.
Jednak już nad czymś pracujesz. Nie powiem ci, żebyś przestał. Powiem, że warto zacząć od czegoś innego, co masz czas na zbadanie i śledzenie cyklu czerwonego zielonego reaktora od samego początku. Upewnij się, że faktycznie używasz testów, aby pomóc Ci dokonać refaktoryzacji. Dopóki nie opanujesz tego sposobu pracy, używaj go oszczędnie w czymś, co jest ważne. Jest to zupełnie inny sposób na kodowanie i wymaga przyzwyczajenia się. Robienie tego w połowie drogi nikomu nie przyniesie pożytku.
To mówi
Uważam, że znacznie łatwiej jest najpierw napisać testy integracyjne, pracować nad kodem, a potem, gdy interfejs API jest nieco zahartowany, faktycznie pracuje nad dodaniem testów jednostkowych. Rodzaje testów, które mogę wykonać na głównej funkcji, że tak powiem, i są bardziej „end-to-end” niż cokolwiek innego.
Zrozum, że test jednostkowy NIE jest po prostu testem, który działa na jedną klasę. Tak długo, jak interfejs API, nad którym pracujesz, można przetestować, nie wykonując żadnej z poniższych czynności:
- Mówi do bazy danych
- Komunikuje się przez sieć
- Dotyka systemu plików
- Nie może działać w tym samym czasie, co inne testy jednostkowe
- Musisz wykonać specjalne czynności w swoim środowisku (np. Edytować pliki konfiguracyjne), aby je uruchomić.
Michael Feathers: zbiór zasad testowania jednostkowego
Więc jeśli twój kompleksowy test obejmuje więcej niż jeden obiekt, to jest w porządku. To jest testowanie jednostkowe, a nie testowanie obiektowe.
Podobnie jak prywatne metody nie muszą być już testowane, tak jak testowane są publiczne metody, które ich używają, tak obiekty nie muszą być początkowo opracowywane pod własną wiązką testową. Tylko wtedy, gdy obiekty są rozważane do użycia niezależnie od historii typu end-to-end, naprawdę muszą być traktowane tak, jakby miały własny interfejs i zachowanie, aby to potwierdzić. Jeśli zachowujesz ostrożność, upubliczniasz te obiekty. W ten sposób nie składasz żadnych obietnic, których nie przetestowałeś.