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)