Nodea — logo

Testy jednostkowe

Testy jednostkowe (ang. unit tests) to automatyczne testy weryfikujące poprawność najmniejszej, dającej się wyodrębnić części programu — zwykle pojedynczej funkcji, metody lub klasy — sprawdzanej w całkowitej izolacji od reszty systemu. Ich celem jest udowodnienie, że dany fragment logiki zwraca oczekiwany wynik dla konkretnych danych wejściowych, zanim kod trafi do większej całości.

Jak działają testy jednostkowe?

Pojedynczy test zwykle realizuje wzorzec AAA: Arrange (przygotuj dane i obiekt do przetestowania), Act (wywołaj testowaną metodę) i Assert (sprawdź, czy wynik zgadza się z oczekiwaniem). Kluczowa jest izolacja — wszystkie zależności zewnętrzne, takie jak baza danych, API czy zegar systemowy, zastępuje się atrapami (mock, stub, fake). Dzięki temu test jest szybki, deterministyczny i sygnalizuje wyłącznie błąd w badanym fragmencie, a nie w jego otoczeniu. Testy pisze się w dedykowanych frameworkach — PHPUnit czy Pest w PHP, Jest w JavaScripcie, pytest w Pythonie — a ich sumaryczne pokrycie kodu (code coverage) pokazuje, jaki odsetek linii został wykonany.

Zastosowanie w praktyce

Testy jednostkowe są fundamentem tak zwanej piramidy testów: powinno być ich najwięcej, bo są tanie i szybkie. Uruchamia się je automatycznie w potoku CI/CD przy każdym commicie — jeśli któryś się nie powiedzie, zmiana nie trafia dalej. Chronią przed regresją: po refaktoryzacji od razu widać, czy dawna funkcjonalność wciąż działa. W metodyce TDD test powstaje jeszcze przed kodem produkcyjnym i wyznacza jego kontrakt. W praktyce dobrze napisany zestaw testów jednostkowych skraca debugowanie — zamiast ręcznie klikać przez aplikację, programista widzi w kilka sekund, który warunek brzegowy przestał być spełniany. Warto testować szczególnie logikę obliczeniową, walidacje i przypadki brzegowe (puste dane, wartości ujemne, przekroczenia zakresu), bo to tam najczęściej rodzą się błędy.

Powiązane pojęcia

Najczęstsze pytania

Czym różnią się testy jednostkowe od integracyjnych?

Test jednostkowy sprawdza jeden fragment kodu w pełnej izolacji, zastępując wszystkie zależności atrapami. Test integracyjny weryfikuje, czy kilka współpracujących komponentów — na przykład kod i realna baza danych — działa razem poprawnie. Testy jednostkowe są szybsze i liczniejsze, integracyjne wolniejsze, ale bliższe rzeczywistości.

Czy 100% pokrycia kodu oznacza brak błędów?

Nie. Pokrycie mówi jedynie, które linie zostały wykonane podczas testów, a nie czy asercje sprawdzają właściwe rzeczy. Można mieć pełne pokrycie i nadal przeoczyć błąd logiczny. Pokrycie to wskaźnik pomocniczy, a nie gwarancja jakości.