Solvro Talks - Testy Jednostkowe
Czym są testy jednostkowe?
Testy jednostkowe to technika testowania oprogramowania, w której najmniejsze, izolowane fragmenty kodu (zwane jednostkami) są sprawdzane pod kątem poprawności działania. Jednostkami mogą być metody, klasy, moduły lub pakiety. Kluczowe cechy testów jednostkowych to automatyczność i powtarzalność, co oznacza, że mogą być uruchamiane wielokrotnie bez zmiany wyników, oraz szybkość – pozwalają na natychmiastowy feedback
na temat działania kodu.
Korzyści z testów jednostkowych
Testy jednostkowe przynoszą szereg korzyści:
● Łatwiejsze zarządzanie kodem: Kod testowany jednostkowo jest zazwyczaj
łatwiejszy do utrzymania i modyfikacji.
● Mniejsza liczba błędów: Regularne testowanie zmniejsza liczbę błędów w kodzie
podczas jego rozwoju.
● Ochrona przed powtarzalnymi błędami: Testy pomagają wykrywać i eliminować
małe, powtarzalne błędy, które mogą wpływać na stabilność systemu.
Jak wygląda test jednostkowy?
Dobry test jednostkowy powinien:
● Mieć odpowiednią nazwę, na przykład shouldReturnListOfEvenNumbers czy
shouldReturnListOfUniqueNumbers.
● Być zgodny z konwencją given/when/then, która pomaga w strukturalnym pisaniu
testów.
● Być niezależny od innych testów.
● Mieć odpowiednią nazwę klasy testowej z sufixem Test i znajdować się w
odpowiednim pakiecie.
Co powinniśmy testować?
Testy jednostkowe powinny obejmować:
● Instrukcje warunkowe: Takie jak if/else i switch.
● Wyrażenia logiczne: Operacje logiczne używane w kodzie.
● Operatory ternarne: Na przykład zmienna ? "true" : "false".
Nie testujemy:
● Metod prywatnych: Testy jednostkowe dotyczą wyłącznie metod publicznych.
● Getterów i setterów: Ponieważ zazwyczaj są one trywialne i ich testowanie nie
przynosi wartości dodanej.
Przykład testu jednostkowego:
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.assertFalse;
import org.junit.jupiter.api.Test;public class NumberUtilsTest {
@Test
public void shouldReturnTrueWhenNumberIsEven() {
// given
int number = 4;// when
boolean result = NumberUtils.isEven(number);// then
assertTrue(result);
}@Test
public void shouldReturnFalseWhenNumberIsOdd() {
// given
int number = 5;// when
boolean result = NumberUtils.isEven(number);// then
assertFalse(result);
}
}
class NumberUtils {
public static boolean isEven(int number) {
return number % 2 == 0;
}
}
Techniki pisania testów jednostkowych
Istnieją dwie główne techniki pisania testów jednostkowych:
● Code first: Tradycyjne podejście, w którym najpierw piszemy kod, a potem testy. Często stosowane w testach integracyjnych.
● TDD (Test Driven Development): Najpierw piszemy test, potem kod, który ma przejść ten test, a następnie refaktorujemy kod. Proces ten przebiega w cyklu RED -> GREEN -> REFACTOR.
Mockowanie i jego znaczenie
Mockowanie to technika, która polega na zastępowaniu rzeczywistych obiektów testowanych przez ich puste implementacje (mocki). Pozwala to na:
● Rejestrowanie interakcji: Wszystkie interakcje z mockiem są rejestrowane do
późniejszej weryfikacji.
● Sprawdzanie zwracanych wartości: Możliwość ustawienia, co dana metoda ma zwracać w teście. Biblioteka Mockito w Javie jest popularnym narzędziem do tworzenia mocków i ułatwia weryfikację interakcji między obiektami.
Gdzie unikać testów jednostkowych?
Niektóre projekty nie wymagają testów jednostkowych, na przykład:
● Prototypy: Projekty o krótkim czasie życia, które nie wymagają intensywnego
testowania.
● Game Development: Gry często wymagają bardziej złożonych testów
integracyjnych i manualnych.
● UI/UX: Testy interfejsu użytkownika zazwyczaj nie są odpowiednie do testów
jednostkowych.
Podsumowanie
Testy jednostkowe pomagają w utrzymaniu wysokiej jakości kodu oraz minimalizowaniu liczby błędów. Na tym poziomie programiści nie powinni zaniedbywać testowania jednostkowego! Jest to nieodłączna nasza nieodłączna technika, którą powinniśmy stosować.