Testování aplikací v Javě Petr Adámek 8. 3. 2016 Petr Adámek, PV168 2 Osnova Testování aplikací ● Co je to testování a proč testovat ● Základní pravidla ● Druhy testů ● Podle způsobu provedení ● Podle cíle ● Jednotkové testování ● Principy ● Mock objekty 8. 3. 2016 Petr Adámek, PV168 3 Testování aplikací Testování aplikací ● Ověřuje soulad implementace se specifikací a s očekáváním zákazníka. ● Je důležitou součástí procesu řízení kvality vývoje software ● Na rozdíl od formální verifikace neumožní odhalit všechny potenciální chyby 8. 3. 2016 Petr Adámek, PV168 4 Testování aplikací Základní pravidla ● Testy by měly být reprodukovatelné. ● Testy by měly být deterministické, tj. měly by mít na začátku vždy stejné vstupní podmínky. ● Testy by měly být nezávislé, tj. nebýt ovlivněny ostatními testy. ● Testy by měly být levně opakovatelné. 8. 3. 2016 Petr Adámek, PV168 5 Druhy testování podle metody IBA CZ, s.r.o. Druhy testování podle metody ● Ruční testování: ● nízké vstupní náklady, drahé opakování; ● obtížné zajištění reprodukovatelnosti, determinismu a nezávislosti ● Automatizované testování: ● vysoké vstupní náklady, levné opakování; ● snadné zajištění reprodukovatelnosti, determinismu a nezávislosti. 8. 3. 2016 Petr Adámek, PV168 6 Druhy testování podle cíle IBA CZ, s.r.o. Druhy testování podle cíle ● Jednotkové testování ● Integrační testování ● Funkční testování ● Akceptační testování ● Testování výkonu a škálovatelnosti ● Testování uživatelské přívětivosti ● Testování bezpečnosti 8. 3. 2016 Petr Adámek, PV168 7 Jednotkové testování IBA CZ, s.r.o. U jednotkového testování se snažíme otestovat jednotlivé komponenty vyvíjeného systému na té nejnižší úrovni. Jednotlivé testované komponenty by měly být izolovány od svého okolí, aby se zamezilo vlivu tohoto okolí na testovanou komponentu. Interakce s okolím je simulována pomocí falešných objektů, které simulují chování okolí v konkrétním testovacím scénáři (viz Mock Objekty). Čím je lépe provedená dekompozice, tím je snadnější jednotkové testování. 8. 3. 2016 Petr Adámek, PV168 8 Nástroje IBA CZ, s.r.o. Nástroje pro jednotkové testování ● JUnit ● TestNG 8. 3. 2016 Petr Adámek, PV168 9 Příklad IBA CZ, s.r.o. public class CalculatorTest { private Calculator c; @Before public void setUp() { c = new Calculator(); } @Test public void testDivide() { assertEquals( 9, c.divide( 99, 10)); assertEquals(10, c.divide(100, 10)); } @Test(expected = IllegalArgumentException.class) public void testDivideByZero() { c.divide(100, 0); } } 8. 3. 2016 Petr Adámek, PV168 10 Postup IBA CZ, s.r.o. Základní pravidla ● Výstupem testu je ANO/NE (boolean) ● Nejdříve testy, potom kód (viz XP a TDD). ● Při opravě chyby nejdříve testy, potom oprava (ochrana proti regresím) ● Triviální get/set metody se netestují ● Testujeme všechny nestandardní situace a hraniční hodnoty ● Single responsibility: jeden test = jedna testovaná věc ● Chybové hlášky a komentáře nejsou vždy potřeba ● Testy se spouští po každé změně 8. 3. 2016 Petr Adámek, PV168 11 Příklad – testování výjimek IBA CZ, s.r.o. public class CalculatorTest { private Calculator c = new Calculator(); @Test(expected = IllegalArgumentException.class) public void testDivideByZeroA() { c.divide(100, 0); } @Test public void testDivideByZeroB() { try { c.divide(100, 0); fail(); } catch (IllegalArgumentException ex) {}; } @Rule public ExpectedException expectedException = ExpectedException.none(); @Test public void testDivideByZeroC() { ExpectedException.expect(IllegalArgumentException.class); c.divide(100, 0); } } 8. 3. 2016 Petr Adámek, PV168 12 Interakce s okolím IBA CZ, s.r.o. Komponenty by se měly testovat izolovaně Je ale nutné nějak simulovat interakci s okolím: ● K tomu slouží tzv. Mock objekty. ● Tyto objekty musí být typově kompatibilní se simulovanou komponentou. ● Dědění ● Implementace rozhraní (vhodnější) ● Mock objekty můžeme vytvářet ručně (pracné) nebo pomocí nástrojů ● Mockito, EasyMock, jMock 8. 3. 2016 Petr Adámek, PV168 13 Příklad IBA CZ, s.r.o. public class CurrencyConvertorTest { @Test public void testConvert() { ExchangeRateTable exchangeRateTable = new ExchangeRateTable() { public void setExchangeRate(Currency currency, BigDecimal exchangeRate) { throw new UnsupportedOperationException("Not supported yet."); } public BigDecimal getExchangeRate(Currency currency) { return BigDecimal.valueOf(28.2); } }; CurrencyConvertor convertor = new CurrencyConvertor(exchangeRateTable); Currency czk = Currency.getInstance("CZK"); BigDecimal actualResult = convertor.convert(czk, BigDecimal.valueOf(10)); BigDecimal expectedResult = BigDecimal.valueOf(282.0); assertEquals(expectedResult, actualResult) } } 8. 3. 2016 Petr Adámek, PV168 14 Testování databázových aplikací IBA CZ, s.r.o. Jak na testování databázových aplikací? ● Použití ORM ● Abstraktní DAO objekt ● In-memory databáze ● DBUnit 8. 3. 2016 Petr Adámek, PV168 15 Demonstrační příklad IBA CZ, s.r.o.© 2009 GraveManagerImplTest 8. 3. 2016 Petr Adámek, PV168 16 Závěr IBA CZ, s.r.o.© 2009 Otázky?