Definicja #
Unit testing (testowanie jednostkowe) to poziom testowania oprogramowania, na którym weryfikowana jest poprawność działania pojedynczej jednostki kodu — funkcji, metody lub klasy — w izolacji od zewnętrznych zależności (bazy danych, API, serwisów).
Izolacja osiągana jest przez zastępowanie zależności testowymi dublerami:
- Mock — obiekt rejestrujący wywołania i zwracający zdefiniowane wartości
- Stub — obiekt zwracający z góry zdefiniowane odpowiedzi
- Fake — uproszczona implementacja zależności (np. in-memory database)
Popularne frameworki testów jednostkowych: JUnit (Java), pytest (Python), NUnit/xUnit (C#), Jest (JavaScript/TypeScript), RSpec (Ruby), Go testing (Go).
Dobre testy jednostkowe spełniają zasadę FIRST: Fast (szybkie), Independent (niezależne), Repeatable (powtarzalne), Self-validating (samo-walidujące), Timely (pisane w odpowiednim czasie).
Unit testing jest filarem metodyk: TDD (Test-Driven Development), BDD (Behavior-Driven Development) i praktyk CI/CD.
Zastosowania #
Unit testing jest stosowany do:
- Weryfikacji poprawności logiki biznesowej — algorytmy, kalkulacje, reguły domeny
- Zabezpieczenia przed regresją — testy wykrywają, gdy zmiana kodu psuje istniejącą funkcjonalność
- Dokumentowania zachowania kodu — testy jako specyfikacja wykonywalna
- Wsparcia refaktoringu — bezpieczna zmiana implementacji przy zachowaniu interfejsu
- Praktyk TDD — testy pisane przed implementacją jako specyfikacja wymagań
Ścieżka nauki #
Przed nauką unit testing warto znać podstawy wybranego języka programowania i rozumieć pojęcie funkcji/metody.
Zacznij od:
- Wybierz framework dla swojego języka: Jest (JS/TS), pytest (Python), JUnit (Java), NUnit lub xUnit (C#)
- Wzorzec Arrange-Act-Assert (AAA) — organizacja testów
- Pisanie pierwszych testów dla prostych funkcji czystych
- Mockowanie zależności: Mockito (Java), NSubstitute (C#), unittest.mock (Python)
Następnie poznaj:
- TDD — Red-Green-Refactor cycle
- Code coverage — metryki pokrycia kodu testami
- Testowanie wyjątków, edge cases, parametryzowane testy
- Różnice: unit vs integration vs end-to-end testing (piramida testów)
FAQ #
- Czym różni się unit testing od integration testing?
- Unit testing weryfikuje pojedyncze jednostki kodu w izolacji (bez rzeczywistych zależności). Integration testing sprawdza współpracę wielu komponentów — np. czy serwis poprawnie komunikuje się z bazą danych lub zewnętrznym API. Unit testy są szybsze i tańsze w utrzymaniu.
- Ile pokrycia kodu testami to dobry wynik?
- Nie ma jednej dobrej odpowiedzi — 80% coverage to często cytowana wartość. Ważniejsza jest jakość testów i pokrycie krytycznej logiki biznesowej, niż sam procent. 100% coverage nie gwarantuje braku błędów.
- Czy unit testing spowalnia development?
- Na krótką metę może wydawać się wolniejszy, ale długoterminowo przyspiesza development. Testy redukują czas debugowania, ułatwiają refaktoring i dają pewność przy wdrożeniach. W CI/CD błędy wykrywane są w minutach, nie dniach.
- Co to jest TDD?
- TDD (Test-Driven Development) to metodyka, w której test piszemy przed implementacją. Cykl Red-Green-Refactor: napisz test który nie przechodzi (red), zaimplementuj minimalny kod żeby przeszedł (green), popraw kod zachowując testy (refactor).
- Jakie frameworki unit testing są najpopularniejsze?
- JavaScript/TypeScript: Jest i Vitest. Python: pytest. Java: JUnit 5. C#: xUnit lub NUnit. Go: wbudowany testing package. Ruby: RSpec. Każdy ekosystem językowy ma swój de facto standard.