Po co komu testy jednostkowe?

Po co komu testy jednostkowe?

Jeśli jesteś młodszym programistą, testy jednostkowe mogą zamieszać Ci w głowie. Co gorsza, testy wykorzystywane jako przykłady często wprowadzają jeszcze więcej zamieszania. Kiedy widzisz coś takiego:

Image description

masz pełne prawo wątpić w jakikolwiek sens ich pisania. Poniżej przedstawiam powody, dla których jednak warto je pisać.

Czym są testy jednostkowe?

Testy jednostkowe to proste skrypty, które sprawdzają, czy dana jednostka – klasa, funkcja, moduł itd. – działa tak, jak powinna. Powinny być raczej nieskomplikowane i obejmować szczęśliwą ścieżkę (happy path) kodu plus garść przypadków brzegowych, czyli tzw. edge cases. Z powodów opisanych poniżej przyczyniają się one do sukcesu projektu.

Przyspiesz testowanie w trakcie programowania

Kiedy zaczynasz zajmować się budowaniem aplikacji, testowanie kodu z poziomu interfejsu użytkownika wydaje się rozwiązaniem całkowicie normalnym. Proces ten może stać się jednak szybszy i mniej zawodny po napisaniu skryptu, który będzie sprawdzał kod za Ciebie. Gdy już przygotujesz takie testy, uruchamianie ich raz za razem nie będzie wymagać żadnych dodatkowych procesów myślowych; możesz je przeprowadzać tak często, jak tylko chcesz. Przeprowadzanie testów prowadzi też do skrócenia pętli sprzężenia zwrotnego, co ułatwi Ci skupienie i poprawi produktywność.

Odkryj przypadki brzegowe

Pisanie testów jednostkowych od razu przywodzi mi na myśl przypadki brzegowe – wszystkie sytuacje, które występują rzadko, są nieoczekiwane lub po prostu błędne. To normalne, że pisząc logikę, skupiasz się na ścieżce happy path, czyli na tym, co typowe i co ma się wydarzyć. Pisząc testy, możesz wprowadzić kontrole przypadków brzegowych i określić, co ma się dziać, gdy wystąpi którykolwiek z nich. Dzięki temu Twój kod będzie odporniejszy na wszelkie nieoczekiwane scenariusze.

Upewnij się, że Twój kod składa się z jednostek

Podczas dodawania testów jednostkowych do kodu zobaczysz, co jest łatwe do przetestowania, a co przetestować jest trudniej. W miarę rozrastania się kodu i zwiększania jego poziomu skomplikowania korzystanie z testów zmusi Cię do dzielenia kodu na łatwe do zarządzania elementy. To świetna sytuacja – dzięki temu Twój kod osiągnie jeszcze lepszą jakość. Każdy segment, któremu przypisano zbyt dużo odpowiedzialności, będzie wymagał wykładniczo więcej testów jednostkowych. W takich przypadkach dobrze jest zatrzymać się na chwilę i przemyśleć, jak zorganizować logikę.

Interaktywna dokumentacja

Testy staną się dodatkowym zasobem dla osoby, która będzie pracować na kodzie po Tobie: dzięki nim dowie się, jaki jest cel kodu i jak ma on działać. To tak jakby dodatkowa dokumentacja z bonusami:

  1. Testy są często bardziej precyzyjne niż opisy znajdujące się we właściwej dokumentacji.
  2. Testy można przeprowadzać na kodzie w aktualnej wersji, aby upewnić się, że wszystkie instrukcje pozostają prawidłowe; w procesie czytania, rozumienia i sprawdzania kodu nie musisz polegać na człowieku.

Zabezpieczenie dla przyszłych zmian

Testy jednostkowe wykonują się tak szybko, że jedynym sensownym podejściem jest uruchamianie ich po każdej aktualizacji niezależnie od tego, jak mała się ona wydaje. Istnieje możliwość ustawienia w swoim repozytorium kodu ciągłej integracji (CI) tak, aby akceptował on tylko te zmiany, które przejdą wszystkie testy z wynikiem pozytywnym. Dzięki temu zapewnisz niczym nie zaburzoną integrację zmian bez względu na wprowadzane zmiany:

  • drobne aktualizacje, które „nie powinny niczego zepsuć”,
  • aktualizacje zewnętrznych bibliotek,
  • szybkie i nie do końca precyzyjne próby wprowadzenia niewielkich zmian.

Testy jednostkowe chronią kod źródłowy przed wszelkimi niewielkimi regresjami, które objęte są ich zakresem.

Podsumowanie

Testy jednostkowe są kluczowym elementem utrzymywania kodu na wysokim poziomie. Można je traktować jak jedną z nóg metaforycznego stołu:

Image description

nogę tę można oczywiście wyjąć, ale przez to stół będzie mniej stabilny. Zajmij się ich pisaniem, a pomogą Ci otrzymać wysoką jakość kodu i zwiększą bezpieczeństwo Twoich aplikacji.