===== 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 [[https://howtodoinjava.com/junit5/junit-5-vs-junit-4|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.