Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Previous revision
Last revision Both sides next revision
courses:b0b36pjv:tutorials:07:testovani [2018/02/06 08:43]
courses:b0b36pjv:tutorials:07:testovani [2024/04/03 17:00]
mudromar [Expected exception]
Line 1: Line 1:
 +===== Testování =====
 +
 +
 +<note important>​
 +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]].
 +</​note>​
 +
 +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ě:​
 +<code java>
 +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);
 +    }
 +}
 +</​code>​
 +
 +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:
 +<code java> ​   ​
 +@Test(expected = ArithmeticException.class)
 +public void testDivisionByZero() {
 +    new Calculator().divide(5,​ 0);
 +}
 +</​code>​
 +
 +Pro JUnit5:
 +
 +<code java>
 +Exception exception = assertThrows(ArithmeticException.class,​ () -> newCalculator().divide(5,​0));​
 +</​code>​
 +
 +
 +==== 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