Testy jednostkowe
Testy jednostkowe (znane również jako testy modułowe lub testy komponentów) są stosowane w tworzeniu oprogramowania. Ich celem jest sprawdzenie, czy poszczególne komponenty oprogramowania działają i funkcjonują zgodnie z zamierzeniami.
Dlaczego testy jednostkowe są przydatne?
Następujące zadania są realizowane w ramach zapewnienia jakości przez testy jednostkowe:
- Testy jednostkowe wykrywają błędy i niezamierzone zmiany funkcjonalności w oprogramowaniu.
- Przy rozszerzaniu funkcji testy jednostkowe ujawniają niezamierzony wpływ na istniejący system.
- Dzięki testom jednostkowym błędy są wykrywane już podczas tworzenia oprogramowania, co pozwala uniknąć kosztów związanych z naprawą błędów.
- Wczesne wykrywanie i usuwanie błędów przyspiesza rozwój oprogramowania.
- Testy jednostkowe (zwłaszcza gdy są zautomatyzowane) mogą być przeprowadzane znacznie szybciej niż testy manualne. Dzięki temu etapy rozwoju są realizowane szybciej, a cykle wydań ulegają skróceniu.
- Testy jednostkowe pomagają w dokumentowaniu systemu, ponieważ pokazują zamierzone funkcje i reakcje testowanego modułu. Jeśli obiekty są sensownie nazwane (Clean Code), dodatkowe działania dokumentacyjne są zbędne.
Zautomatyzowane testy jednostkowe
Przy tworzeniu oprogramowania metodami zwinnymi, w ramach programowania sterowanego testami i refaktoryzacji, testy jednostkowe są często przeprowadzane w celu szybkiego wykrywania błędów i poprawy jakości. Aby testowanie nie wiązało się z dodatkową pracą i mogło być przeprowadzane w sposób ekonomiczny, testy jednostkowe są zautomatyzowane dzięki tzw. automatyzacji testów.
Pierwotnie ten rodzaj automatyzacji zaproponował Kent Beck jako małe środowisko, które miało wspierać tworzenie zautomatyzowanych testów jednostkowych. Z tego powstał framework SUnit dla różnych języków programowania, z którego później rozwinął się framework JUnit dla JavaScript.
Frameworki testowe wywołują poszczególne klasy testów i wykonują ich testy komponentów. Zazwyczaj wyniki testów są prezentowane przez frameworki testowe w formie graficznego podsumowania.
Na co zwrócić uwagę przy tworzeniu testów jednostkowych?
Jeśli ty i twój zespół chcecie pisać własne testy jednostkowe, zwróćcie uwagę na następujące kwestie:
- Testy powinny działać niezależnie od siebie, aby wyniki testów nie wpływały wzajemnie na siebie. Jeśli tak jest, kolejność testów nie ma znaczenia.
- Testy jednostkowe powinny być krótkie i łatwe do zrozumienia oraz testować zawsze tylko jedną właściwość.
- Testy powinny być w pełni zautomatyzowane, aby mogły być przeprowadzane tak często, jak to możliwe.
- Testy jednostkowe powinny testować tylko naprawdę istotny kod (np. nie getter ani setter) i są grupowane wokół fixture testowego (nie wokół klasy).
- Testy jednostkowe powinny być – zwłaszcza w ramach programowania sterowanego testami – pisane przed testowanym kodem. Ten dodatkowy nakład implementacyjny powinien być zawsze uwzględniany podczas planowania nowych funkcji i możliwości.
Jak działają testy jednostkowe?
Większość testów opiera się na podobnej strukturze podstawowej:
- Inicjowany jest stan wyjściowy.
- Wykonywana jest testowana operacja.
- Wynik jest porównywany z wartością docelową wynikającą ze specyfikacji.
Kto pisze testy jednostkowe?
W niektórych firmach tworzenie oprogramowania i zapewnienie jakości są nadal rozdzielone, przez co testy jednostkowe nie są pisane przez samych programistów.
Jeśli twoja firma działa według metod zwinnych, cała odpowiedzialność za tworzenie i działanie oprogramowania powinna pozostać w tym samym zespole – innymi słowy: zespół, który pisze kod oprogramowania, tworzy również testy jednostkowe.
Podsumowanie dotyczące testów jednostkowych
Nawet jeśli za pomocą testów jednostkowych można wykryć jedynie przewidywane błędy w aplikacjach (ponieważ tylko dla nich są pisane testy), stały się one ważnym środkiem zapewnienia jakości oprogramowania. W szczególności zautomatyzowane testowanie jednostek przyspiesza proces wczesnego wykrywania i usuwania błędów oraz wspiera iteracyjną pracę, prototypowanie i ciągłe doskonalenie produktów, zwłaszcza w zwinnym tworzeniu oprogramowania.