Testování a unit testy
Proč to potřebuji?
Unit testy automaticky ověřují správnost jednotlivých metod a tříd. Zajišťují, že refaktoring nebo nové funkce nerozbijí existující funkčnost.
Teorie
Unit test testuje nejmenší jednotku kódu (metodu/třídu) izolovaně. V Javě se používá framework JUnit 5.
Vzor AAA: Arrange (příprava dat) → Act (volání testované metody) → Assert (ověření výsledku).
Testy zajišťují, že refaktoring nerozebije existující funkčnost. Měly by být rychlé, nezávislé a opakovatelné.
Příklady
// Třída k testování
public class MathUtils {
public static int faktorial(int n) {
if (n < 0) throw new IllegalArgumentException("Záporné číslo");
if (n <= 1) return 1;
return n * faktorial(n - 1);
}
public static boolean jePrvocislo(int n) {
if (n < 2) return false;
for (int i = 2; i <= Math.sqrt(n); i++) {
if (n % i == 0) return false;
}
return true;
}
}
// JUnit 5 testy
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class MathUtilsTest {
@Test
void testFaktorial() {
// Arrange & Act & Assert
assertEquals(1, MathUtils.faktorial(0));
assertEquals(1, MathUtils.faktorial(1));
assertEquals(120, MathUtils.faktorial(5));
}
@Test
void testFaktorialZaporny() {
// Test výjimky
assertThrows(IllegalArgumentException.class, () -> {
MathUtils.faktorial(-1);
});
}
@Test
void testJePrvocislo() {
assertTrue(MathUtils.jePrvocislo(2));
assertTrue(MathUtils.jePrvocislo(7));
assertFalse(MathUtils.jePrvocislo(1));
assertFalse(MathUtils.jePrvocislo(4));
}
@BeforeEach
void setUp() {
// Příprava před každým testem
}
@AfterEach
void tearDown() {
// Úklid po každém testu
}
}
Shrnutí
Klíčové body
- JUnit 5:
@Test,@BeforeEach,@AfterEach - AAA vzor: Arrange → Act → Assert
assertEquals,assertTrue,assertThrows– základní assertions- Testovat happy path i edge cases (null, prázdné vstupy, výjimky)