Co jest jednostka testy, naprawdę? I czy w grze jest tak duża dychotomia?
Pracujemy w dziedzinie, w której czytanie dosłownie jednego bitu poza końcem bufora może całkowicie spowodować awarię programu lub spowodować, że da on całkowicie niedokładny wynik, lub jak dowodzi niedawny błąd TLS „HeartBleed”, rozłożyć rzekomo bezpieczny system na cały system otwarte bez przedstawienia żadnych bezpośrednich dowodów wady.
Niemożliwe jest wyeliminowanie całej złożoności tych systemów. Ale naszym zadaniem jest, w możliwym zakresie, zminimalizowanie tej złożoności i zarządzanie nią.
Czy test jednostkowy jest testem, który potwierdza na przykład, że rezerwacja została pomyślnie wysłana w trzech różnych systemach, tworzony jest wpis do dziennika i wysyłane jest potwierdzenie e-mailem?
Powiem nie . To test integracyjny . A te zdecydowanie mają swoje miejsce, ale są też innym tematem.
Test integracji działa w celu potwierdzenia ogólnej funkcji całej „funkcji”. Ale kod stojący za tą funkcją powinien zostać podzielony na proste, sprawdzalne elementy składowe, zwane także „jednostkami”.
Test jednostkowy powinien więc mieć bardzo ograniczony zakres.
Co oznacza, że kod testowany przez test jednostkowy powinien mieć bardzo ograniczony zakres.
Co dodatkowo oznacza, że jednym z filarów dobrego projektu jest rozbicie złożonego problemu na mniejsze, jednozadaniowe części (w możliwym zakresie), które można przetestować we względnej izolacji od siebie.
W rezultacie otrzymujesz system wykonany z niezawodnych komponentów fundamentowych i wiesz, czy którakolwiek z podstawowych jednostek kodu się psuje, ponieważ napisałeś proste, małe testy o ograniczonym zakresie, aby dokładnie to powiedzieć.
W wielu przypadkach prawdopodobnie powinieneś mieć wiele testów na jednostkę. Same testy powinny być proste, testując jedno i tylko jedno zachowanie w możliwym zakresie.
Pojęcie „testu jednostkowego” testującego nietrywialną, skomplikowaną logikę jest, jak sądzę, trochę oksymoronem.
Jeśli więc nastąpił taki celowy podział projektu, to jak na świecie test jednostkowy mógłby nagle zacząć generować fałszywe alarmy, chyba że podstawowa funkcja testowanej jednostki kodu uległa zmianie? A jeśli tak się stanie, lepiej uwierzyć, że w grze występują pewne nieoczywiste efekty tętnienia. Twój zepsuty test, ten, który wydaje się dawać fałszywie dodatni, tak naprawdę ostrzega cię, że jakaś zmiana przerwała szerszy krąg zależności w bazie kodu i należy go zbadać i naprawić.
Niektóre z tych jednostek (wiele z nich) mogą wymagać przetestowania przy użyciu fałszywych obiektów, ale to nie znaczy, że musisz pisać bardziej złożone lub skomplikowane testy.
Wracając do mojego contrived przykładzie systemu rezerwacji, naprawdę nie można wyłączyć wysyłanie żądań do bazy danych rezerwacji na żywo lub usług osób trzecich (lub nawet „dev” instancji nim) przed każdym jednostka testowego kodu.
Używasz więc makiet, które przedstawiają tę samą umowę interfejsu. Testy mogą następnie zweryfikować zachowanie stosunkowo niewielkiego, deterministycznego fragmentu kodu. Zielony na całej planszy następnie mówi, że bloki, które składają się na twoją podstawę, nie są zepsute.
Ale logika samych testów jednostkowych pozostaje tak prosta, jak to możliwe.