Temat: Czy przy pomocy TDD tworzony kod jest lepszy- eksperyent
Jarek Żeliński:
Cezary Kowalski:wydaje mi się, że system składający się 500 klas nie wymaga napisania 500 testów a jedynie kilkunastu...
Tak i nie - wszystko zależy od poziomu ryzyka liczonego w $$$ i/lub ludzkim życiu.
Ma tu na myśli sytuacje:
- komponent i jego interfejs: tylko test interfejsu (jeżeli jest złoóżnoy, testy interfejsów jego podsystemów)
- agregat: testy korzenia agregatu (zakładam, że wnętrze agregatu jest chronione, jego korzeń jest jego interfejsem)
Jeżeli dobrze zrozumiałem, co chciałeś powiedzieć to masz rację. Powiedzmy, że mamy klasy A,B,C przy czym klasa C jest agregatem klas A i B. W takiej sytuacji faktycznie nie ma sensu testować klas A i B jako składowe klasy C ale tylko pod warunkiem, że klasy te są rzeczywiście hermetyczne i wcześniej przetestowane. Natomiast należy zwrócić uwagę, że agregat sam w sobie może zawierać i/lub udostępniać nową funkcjonalność i ta już powinna być testowana. Nawet jeżeli agregat nie udostępnia i/lub zawiera takiej funkcjonalności to powinna być przynajmniej utworzona klasa testowa aby w przyszłości jak zajdzie potrzeba zmian w klasie C nie było wymówki "nie było przewidzianej klasy testowej to nie pisałem przypadków bo myślałem, że nie trzeba".
W idealnym przypadku klas testujących (jednostkowych) powinno być tyle ile klas w systemie. Ilość przypadków testowych jest funkcją ilości metod (nie tylko tych wchodzących w skład interfejsów ale też tych prywatnych) oraz charakteru domeny. Ilość scenariuszy powinna być przynajmniej równoważna ilości prawidłowych przypadków użycia. Proszę zwrócić uwagę, że jeszcze nie ma na liście testów integracyjnych a już widać, że "testów" jest więcej niż samych klas a przynajmniej więcej niż interfejsów.
Natomiast w praktyce wygląda to tak, że scenariusze testowe pokrywają tylko najpopularniejsze i/lub krytyczne przypadki użycia, co jeszcze daje się przełknąć. Natomiast wyłączanie z testowania klas, które w chwili pisania na oko można sprawdzić, że są dobre i/lub przy tym ważne z perspektywy prawidłowego działania systemu powinno być karane "biczowaniem na środku rynku". Dlaczego? Ponieważ jak za rok, dwa, pięć przyjdzie zmiana do systemu, która wymaga zmiany w tej "prostej" klasie i system się wysypie na produkcji (nie mógł wysypać się wcześniej bo klasa nie była testowana) i przy tym ktoś pójdzie do piachu albo firma straci kupę szmalu to wywalą albo wsadzą za kraty nie projektanta, nie kierownika, nie dyrektora tylko programistę, który dokonał zmiany.
I tu wracamy (po nudnym wywodzie - sory) do prostego wniosku, że zakres testów jest pochodną ryzyka liczonego w $$$ i/lub ludzkim życiu. Dla pierdletu klas i przypadków może nawet być zero i wszystko "w boju"ale dla firmware działającego na aparacie do pomiaru ciśnienia i tętna będzie sprawdzane nawet położenie przecinka na wyświetlaczu aby czasem ze 130,0 nie zrobiło się 1300 mmHg.