Dlaczego warto pisać testy jednostkowe

Dzisiaj będzie gadka motywacyjna o pisaniu testów więc jeśli jeszcze nie piszesz, może to Ciebie w końcu przekona.

We wpisie Testowanie własnego ControllerFactory w MVC pisałem jak to zmarnowałem 6h na napisanie praktycznie jednego testu do kawałka kodu, który można napisać w 15 minut i przez dodatkowe 15 minut prze-klikać w kilku różnych przypadkach. Gdzie tu logika, gdzie tu sens. Pisząc CustomControllerFactory nie pisze się go z byle powodu, pisze się, ponieważ są potrzebne bardzo specyficzne wymagania. Pisząc kod wiemy dokładnie co robi każda linijka, wiemy po co jest każdy jeden if i dlaczego wartość trzeba pomnożyć razy 0.192 co 10te obliczenie. Jednak co się stanie z tą wiedzą za tydzień albo za miesiąc czy za rok? Na prawdę będziesz wiedzieć co to jest to wspomniane 0.192? Będziesz wiedzieć co robi flaga isLocal = false? Założę się, że 90% tego typu wiedzy wyparuje. Więc jeśli po roku przyjdzie nam napisać nową funkcjonalność lub poprawić buga, jest olbrzymia szansa, że zupełnie nieświadomie coś zepsujemy bo już nie będziemy pamiętali dlaczego coś zostało napisane tak a nie inaczej. Jeśli jednak napiszemy testy to ta wiedza jest zawarta w testach. Nawet i za 20 lat uruchamiając testy będzie można sprawdzić czy założenia są spełnione i to bez względu na to czy kod po drodze był refaktoryzowany czy nie. Niezły luksus. Jeśli to nie przekonuje Cię do testów jednostkowych to mam jeszcze jedną historię z życia wziętą:

Napisałem mechanizm wczytywania licencji w C#… z pliku tekstowego generowanego w Delphi… z testami jednostkowymi. Generalnie lodzio miodzio, wszystko działa. Do czasu aż nie okazało się, że polskie literki nie bardzo działają. Gdzieś się tablice bajtów nie zgadzały, licencja się nie validowała, ogólnie masakra. Trzeba poprawić. Wygenerowana została testowa licencja z polskimi znaczkami, która nie działała. Dopisany został nowy test z tą licencją – test nie przechodzi. Po w sumie 15 minutach, jest… ta jedna linijka kodu (ave SOLID) gdzie małe hokus pokus z encodingami i bam…. licencja działa, validuje się. Super! ale teraz trzeba będzie wygenerować nowe licencje dla starych klientów no bo nowa wersja z taką zmianą zepsuje się na starych plikach…. i tu oświecenie. Przecież dopisaliśmy nowy test z polskimi literkami, a przecież stare testy się nie zmieniły i dalej działają, czyli poprawka działa na nowe a nie psuje starego. Hura.. w 15 minut zakończone zadanie. Nie trzeba było generować iluś tam licencji, wgrać, konfigurować, prze-klikać. Testy zaoszczędziły co najmniej godzinę mojego czasu i nie wiem ile czasu wdrożeniowca. I jak tu wierzyć komuś, kto mówi, że pisanie testów kosztuje 2x tyle czasu co pisanie bez testów.