Istnieją dwa powody, dla których warto pisać testy:
- Zapewnianie oczekiwanego zachowania
- Zapobieganie regresji zachowań
Podejście (1) Zapewnienie oczekiwanego zachowania:
Podczas potwierdzania oczekiwanego zachowania chcesz się upewnić, że kod działa tak, jak myślisz, że powinien. Jest to w rzeczywistości zautomatyzowany sposób wykonywania rutynowej ręcznej weryfikacji, którą każdy programista wykonałby podczas implementacji dowolnego rodzaju kodu:
- Czy to, co właśnie napisałem, działa?
- Czy ta pętla faktycznie się kończy?
- Czy zapętla się w kolejności, w jakiej myślę, że jest?
- Czy to zadziała dla zerowego wejścia?
To są pytania, na które wszyscy odpowiadamy w naszych głowach i zwykle próbujemy wykonać kod również w naszych głowach, upewniając się, że wygląda na to, że działa. W takich przypadkach często warto poprosić komputer o udzielenie ostatecznej odpowiedzi. Więc piszemy test jednostkowy, który zapewnia, że tak. Daje nam to zaufanie do naszego kodu, pomaga nam wcześnie znajdować usterki, a nawet może pomóc w faktycznym wdrożeniu kodu.
Warto to zrobić wszędzie tam, gdzie uważasz, że jest to konieczne. Każdy kod, który jest trochę trudny do zrozumienia lub nietrywialny. Nawet trywialny kod mógłby na tym skorzystać. Chodzi o twoją własną pewność siebie. To, jak często to robisz i jak daleko zajdziesz, zależy od twojej własnej satysfakcji. Przestań, kiedy możesz śmiało odpowiedzieć Tak na: Czy na pewno to działa?
W przypadku tego rodzaju testów nie obchodzi Cię widoczność, interfejsy itp., Zależy Ci tylko na tym, aby kod działał. Więc tak, przetestowałbyś prywatne i chronione metody, gdybyś uważał, że trzeba je przetestować, aby odpowiedzieć Tak na pytanie.
Podejście (2) Zapobieganie regresji zachowania:
Kiedy już masz działający kod, musisz mieć mechanizm, który chroni go przed przyszłymi uszkodzeniami. Gdyby nikt nigdy więcej nie dotykał twojego źródła i konfiguracji, nie potrzebujesz tego, ale w większości przypadków ty lub inni będziecie dotykać źródła i konfiguracji twojego oprogramowania. To wewnętrzne majsterkowanie jest wysoce prawdopodobne, że złamie twój działający kod.
Mechanizmy istnieją już w większości języków jako sposób ochrony przed tymi uszkodzeniami. Funkcje widoczności to jeden mechanizm. Prywatna metoda jest izolowana i ukryta. Hermetyzacja to kolejny mechanizm, w którym dokonuje się podziału rzeczy, tak aby zmiana innych przedziałów nie wpływała na innych.
Ogólny mechanizm tego nazywa się: kodowanie do granicy. Tworząc granice między częściami kodu, chronisz wszystko wewnątrz granicy przed rzeczami znajdującymi się poza nią. Granice stają się punktem interakcji i umową, poprzez którą rzeczy oddziałują.
Oznacza to, że zmiany granicy, albo przez złamanie jej interfejsu, albo przez złamanie jej oczekiwanego zachowania, mogą uszkodzić i prawdopodobnie złamać inne granice, na których polegały. Dlatego dobrym pomysłem jest przeprowadzenie testu jednostkowego, który jest ukierunkowany na te granice i zapewnia, że nie zmieniają się one pod względem semantycznym i zachowania.
To jest twój typowy test jednostkowy, o którym większość mówi o TDD lub BDD. Chodzi o to, aby granice utwardzały się i chroniły przed zmianami. Nie chcesz testować w tym celu metod prywatnych, ponieważ metoda prywatna nie jest granicą. Metody chronione są ograniczoną granicą i chroniłbym je. Nie są wystawieni na działanie świata, ale nadal są wystawieni na działanie innych przedziałów lub „Jednostek”.
Co z tym zrobić?
Jak widzieliśmy, istnieje dobry powód do testowania jednostkowego metod publicznych i chronionych, aby zapewnić, że nasze interfejsy się nie zmieniają. Jest też dobry powód, aby przetestować metody prywatne, aby potwierdzić, że nasza implementacja działa. Więc czy powinniśmy przetestować je wszystkie?
Tak i nie.
po pierwsze : Przetestuj wszystkie metody, które Twoim zdaniem wymagają ostatecznego dowodu, że działa w większości przypadków, aby mieć pewność, że kod działa, niezależnie od widoczności. Następnie wyłącz te testy. Zrobili tam pracę.
W końcu : pisz testy dla swoich granic. Miej test jednostkowy dla każdego punktu, który będzie używany przez inne jednostki twojego systemu. Upewnij się, że ten test potwierdza kontrakt semantyczny, nazwę metody, liczbę argumentów itp. A także upewnij się, że test potwierdza dostępne zachowanie jednostki. Twój test powinien zademonstrować, jak korzystać z urządzenia i co może zrobić. Pozostaw te testy włączone, aby były uruchamiane przy każdym wypychaniu kodu.
UWAGA: Przyczyną wyłączenia pierwszego zestawu testów jest umożliwienie wykonania prac refaktoryzacji. Test aktywny to sprzężenie kodu. Zapobiega przyszłej modyfikacji testowanego kodu. Chcesz tego tylko dla swoich interfejsów i umów interakcji.