Ladění programů, testování jednotek (junit) Obsah Ladění programů (debugging)........................................................................................1 Ladění programů v Jávě .......................................................................................................1 Ještě lepší...........................................................................................................................2 Běhové ověření podmínky - assert..................................................................................3 PostuppříprácisassertWllflPErjlA ................................................................................3 Tlir Km- Fib i. L-^i-iL i Ukázka použití assert (1) ......................................................................................................3 Ukázka použití assert (2) ......................................................................................................3 Ukázka použití assert (3) ......................................................................................................4 Ukázka použití assert (4) ......................................................................................................4 Testování jednotek nástrojem junit .................................................................................4 Postup při práci s JUnitWllCIPEMA ..................................................................................4 Tri r put ml i. u n n Li Ukázka použití JUnit (1).......................................................................................................5 Ukázka použití JUnit (2).......................................................................................................5 Ukázka použití JUnit (3).......................................................................................................5 Ukázka použití JUnit (4).......................................................................................................6 Návrh dle kontraktu.....................................................................................................6 Postup při práci s j a s s WlKIPEI li A ....................................................................................6 Odkazy .............................................................................................................................7 Ladění programů (debugging) • Ladění programů s debuggerem jdb • Nástroje ověřování podmínek za běhu - klíčové slovo assert • Nástroje testování jednotek (tříd, balíků) - junit • Pokročilé systémy dynamického ověřování podmínek -jass Ladění programů v Jávě Je mnoho způsobů... 1 Ladění programů, testování jednotek _____________(junit)_____________ • kontrolní tisky - System, err. println (...) WlKlPEDlA íli r priT Fit i. Laanb i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=System.err.println(...)] řádkovým debuggerem jdb WlKIPFMA ill r p pit riL i. L-aanL i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=jdb] • integrovaným debuggerem v IDE • pomocí speciálních nástrojů na záznam běhu pg.: nejrůznější "loggery" - standardní poskytuje od JDK1.4 balík java.util. logging WlCTPFMA ílir rni- riL i. uniii [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=java.util.logging] nebo alternativní a zdařilejší log4j WHCIPFľJlA flip p m1 r ■■ i. LniBi [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=log4j] Jeste lepši... • je používat systémy pro běhovou kontrolu platnosti podmínek: • vstupní podmínka metody (zda je volána s přípustnými parametry) • výstupní podmínka metody (zda jsou dosažené výstupy správné) • a podmínka kdekoli j inde - např. invariant cyklu... • K tomuto slouží j ednak standardní klíčové slovo (od JDK1.4) assert booleovský výraz WlKľlPFDlA "Tfcr Fni- Fib i. L-ja^ki [http://cs.wikipedia.org/wiki/Speci%C3%A 1 ln%C3%AD: Search?search=assert booleovský výraz] • testovací nástroje typu JUnit VťlKlPFhlA íli r p n t riL i. L ■■■■> ■ [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search= JUnit ] (a varianty -HttpUnitWlKTIPFnlA íli r p n t riL i. Ľ aan L i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=HttpUnit],...) - s metodami assertEquals () WlK.lfT.IJlA ill P P PI T Plk 1. LbBiL■ [http://cs.wikipedia.org/wiki/Speci%C3%A 1 ln%C3%AD: Search?search=assertEquals()] apod. • pokročilé nástroje na běhovou kontrolu platnosti invariantů, vstupních, výstupních a dalších podmínek - např. jassWlK.lfT.DlA Imp P pit Plk i. LniBi [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=jass] (Java with Assertions), http://csd.informatik.uni-oldenburg.de/~jass/. 2 Ladění programů, testování jednotek _____________(junit)_____________ • Ukázka testu jednotky:Test třídy ChovatelPsuWlKľlPEMA ■lir p pit Fib i. Lnni [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=ChovatelPsu] [http://www.fi.muni.cz/~tomp/java/ucebnice/javasrc/svet/chovatelstvi/psi/ChovatelPsuTest.java] Běhové ověření podmínky - assert Postup při práci s assertSIľSIÍ [http://cs.wikipedia.Org/wiki/Speci%C3%A1ln%C3%AD:S earch?search=assert] Postup: 1. Napsat zdrojový program užívající klíčové slovo assertWlfCIPFľílA ľlír pm- Fib i. Lbbibi [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=assert] (pouze od verze Java2 vl.4 výše). Nepotřebujeme žádné speciální běhové knihovny, vše je součástí Javy; musíme ovšem mít překladové i běhové prostředí vl.4 a vyšší. 2. Přeložit jej s volbou -source 1. 4 3. Spustit jej s volbou-ea (-enableassertions). Aktivovat aserce lze i selektivně pro některé třídy (-ea název_třidy nebo -ea ná-zev_baliku. . . - tři tečky na konci!!!). 4. Dojde-li za běhu programu k porušení podmínky stanovené za assert, vznikne běhová chyba (AssertionError) a program skončí. Ukázka použití assert (1) Třída Zlomek používá assert k ověření, že zlomek není (chybou uživatele) vytvářen s nulovým jmenovatelem. Za assertWlKIPFhlA Imp p pit Fib i. Ľaink i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=assert] uvedeme, co musí v daném místě za běhu programu platit. Obrázek 1. Třídy AssertDemo, Zlomek Ukázka použití assert (2) 3 Ladění programů, testování jednotek _____________(junit)_____________ Program přeložíme (s volbou - s o u r c e 1.4): Obrázek 2. Správný postup překladu AssertDemo Ukázka použití assert (3) Program spustíme (s volbou -ea nebo selektivním -ea: NázevTřidy): Obrázek 3. Spuštění AssertDemo s povolením assert Ukázka použití assert (4) Spustíme-li bez povolení assert (bez volby -ea nebo naopak s explicitním zákazem: -da), pak program podmínky za assert neověřuje: Obrázek 4. Spuštění AssertDemo bez povolení assert Testování jednotek nástrojem junit Postup při práci s JUnitS!5!™™í [http://cs.wikipedia.Org/wiki/Speci%C3%A1ln%C3%AD:S earch?search=JUnit] Uvědomit si, že žádný nástroj za nás nevymyslí, JAK máme své třídy testovat. Pouze nám napomůže ke snadnějšímu sestavení a spuštění testu. Postup: 1. Stáhnout si z http://junit.org poslední (stačí binární) distribuci testovacího prostředí. 2. Nainstalovat JUnitWlKIPF.TllA ílir pnT riL i. Laanb i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=JUnit] (stačí rozbalit do samostatného adresáře). 3. Napsat testovací třídu/třídy - buďto implementují rozhraní junit. framework.Test WIKIPFÍJIA "Tlip ľni- Fib i. L-^Biki [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=junit.framework.Test] ne- 4 Ladění programů, testování jednotek _____________(junit)_____________ WIICIPRDIA ílir rni1 Fib i. ľbbibi [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=junit.framework.TestCase 4. Testovací třída obsahuje metodu na nastavení testu (setUp), testovací metody (test/Veco) a úklidovou metodu (tearDown). 5. Testovací třídu spustit v prostředí (řádkovém nebo GUI) - junit. textui .TestRunner WlKlPFfJlA Dir ľni- Fii i. L^a-iki [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=junit.textui.TestRunner], junit. swingui . TestRunnerWlKl Pľ.l JI A 'Flip r'm- Fib i. L-^Bih i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=junit.swingui.TestRunner 6. Testovač zobrazí, které testovací metody případně selhaly. Ukázka použití JUnit (1) Třída Zlomek zůstává zhruba jako v předchozím příkladu, přibývají však metody equals (porovnává dva zlomky, zda je jejich číselná hodnota stejná) a součet (sečítá dva zlomky, součet vrací jako výsledek). Obrázek 5. Upravená třída Zlomek s porovnáním a součtem Ukázka použití JUnit (2) Testovací třída JUnitDemo má „přípravnou" metodu setUp, tearDown a testovací metody. Obrázek 6. Testovací třída JUnitDemo Ukázka použití JUnit (3) Spuštění testovače v prostředí GUI Swing nad testovací třídou JUnitDemo. Obrázek 7. Spouštění testovače nad testovací třídou JUnitDemo Pokud testovací třída prověří, že testovaná třída/y je/jsou OK, vypadá to přibližně takto: Obrázek 8. Testovač spouštějící třídu JUnitDemo 5 Ladění programů, testování jednotek _____________(junit)_____________ Ukázka použití JUnit (4) Má-li testovaná třída/y chyby a zjistí-li to testovač, vypadá to třeba takto: Obrázek 9. Testovací třída JUnitDemo našla chybu Návrh dle kontraktu Postup při práci s jassí?!?E!5!í [http://cs.wikipedia.Org/wiki/Speci%C3%A1ln%C3%AD:S earch?search=jass] jass je preprocesor javového zdrojového textu. Umožňuje ve zdrojovém textu programu vyznačit podmínky, jejichž splnění je za běhu kontrolováno. Podmínkami se rozumí: • pre- a postconditions u metod (vstupní a výstupní podmínky metod) • invarianty objektů - podmínky, které zůstávají pro objekt v platnosti mezi jednotlivými operacemi nad objektem Postup práce s jass: stažení a instalace balíku z http://csd.informatik.uni-oldenburg.de/~jass/ • vytvoření zdrojového textu s příponou . jassWlĽIPF.ľllA "Tlir rn-i- Fia ■ L^valj [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=jass], javovou syntaxí s použitím speciálních komentářových značek • takový zdrojový text je přeložitelný i normálním překladačem javacWlPCIPEDlA TTir ľni- Fib u Lbbibi [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=javac], ale v takovém případě ztrácíme možnosti jass • proto nejprve .jas sWlKIPRMA "ir rnn1 Pil i. l-iinb i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=jass] souboru převedeme preprocesorem jass na javový (. j avaWlKIPEDlA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=java]) soubor 6 Ladění programů, testování jednotek _____________(junit)_____________ WIICIPFMA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=javac] a "Tlir FVi-i- Fib i.Lavibi spustíme javaWllflPFniA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=java], tedy jako každý jiný zdrojový soubor v Jávě • z . jassWlKlPFTllA TTir Fni- Fík ■_ Lj^*-iLi [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=jass] zdrojů je možné vytvořit také dokumentaci API obsahující jass značky, tj. informace, co kde musí platit za podmínky atd. - vynikající možnost! Odkazy • JUnit homepage [http://junit.org] • Java 1.4 logging API guide [http://java.sun.eom/j2se/l.4.2/docs/guide/util/logging/] • Log4j homepage [http://jakarta.apache.org/log4j/docs/index.html] • jass homepage [http://csd.informatik.uni-oldenburg.de/~jass/] • úvodní materiálek [http://www.inf.fu-berlin.de/lehre/SS01/VIS/Dokumente/Vortraege/junit.pdf] k použití junit (v němčině, jako PDF) 7