===== Testování =====
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);
}
==== 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.