Warning
This page is located in archive.

Testování

Níže uvedený text popisuje syntaxi JUnit 4. V současné době se běžně používá JUnit 5. Jeho použití a rozdíly oproti JUnit 4 popisuje tato stránka.

Máme k dispozici implementaci programu a potřebujeme ji otestovat. Aby nám testovací konstrukce nepřekážela v implementaci, je výhodné ji mít někde separátně - jako např. jUnit test class. V Mavenu se testovací třídy umisťují do složky src/test.

Vytvoření testovací třídy a metod

Minimální testovací třída může vypadat následovně:

import org.junit.*;
import static org.junit.Assert.*;
public class CalculatorTest {
    @Test
    public void testIt() {
        Calculator c = new Calculator();
        int result = c.add(12, 5);
        assertTrue("12 + 5 should equals 17, not " + result, result == 17);
    }
}

Vyzkoušejte si, co se stane, když funkce add bude vracet jiný než očekávaný výsledek.

Assert

Porovnávacích funkcí je spousta (viz javadoc):

  • assertTrue
  • assertFalse
  • assertEquals
  • assertArrayEquals
  • assertNull
  • assertNotNull
  • assertSame
  • assertNotSame

Expected exception

Testovací metoda může testovat i správné házení výjimek. Stačí do anotace metody připsat třídu očekávané výjimky. Můžete například otestovat dělení nulou zápisem:

@Test(expected = ArithmeticException.class)
public void testDivisionByZero() {
    new Calculator().divide(5, 0);
}

Pro JUnit5:

Exception exception = assertThrows(ArithmeticException.class, () -> new Calculator().divide(5,0));

Timeout

Lze i testovat dobu trvání metod. Například pokud dokážeme odhadnout dobu výpočtu, můžeme nastavit timeout, po jehož překročení skončí test chybou. Vhodné například pro detekci zacyklení programu. @Test(timeout = 100). V našem případě kalkulačky to může být použito například pro testování efektivity algoritmu funkce faktorial (rozdíl mezi iterativním a rekurzivním výpočtem).

Další anotace

Pokud testujete složitější třídu, kde je potřeba inicializovat data před testy, lze použít metody s anotacemi:

  • @Before, @After - spustí se před a po každém testu (metodě s anotací @Test)
  • @BeforeClass, @AfterClass - spustí se před prvním a po posledním testu

Dále existuje anotace:

  • @Ignore - lze zapsat před @Test a tím tento test vypustit (vhodné např. když daná testovaná část programu není aktuálně v provozuschopném stavu)

Poznámky

Pokud je tělo testovací metody prázdné, pak test dopadne úspěšně. To znamená ale jen, že neobjevil chybu, ne že žádná chyba neexistuje. Správný test najde všechny případy, ve kterých dojde k chybě (funkce se chová jinak než se očekává) a skončí hláškou Failed; v ostatních případech (pokud je funkce bezchybná) skončí s hláškou Passed.

courses/b0b36pjv/tutorials/07/testovani.txt · Last modified: 2024/04/08 15:24 by mudromar