Kuchárka k JUnit

Pôvodný zdroj

Kent Beck, Erich Gamma: JUnit Cookbook, 2006, dostupné z <http://junit.sourceforge.net/doc/cookbook/cookbook.htm>

Úvod

Tento text je krátka kuchárka, kde nájdete kroky, ktorých sa môžete pridržiavať pri písaní a udržiavaní vašich testov vytváraných pomocou knižnice JUnit.

Jednoduchý testovací prípad

Ako píšete testovací kód?

Najjednoduchšie je použiť ladiace výrazy v debuggeri. Môžete ich meniť počas behu programu, nemusíte nič nanovo kompilovať a môžete ich vytvárať počas sledovania vytváraných objektov. Druhou možnosťou je tvorba testovacieho kódu, ktorý bude vypisovať stav programu na štandardný výstup. Oba prístupy sú však obmedzené, pretože vyžadujú úsudok človeka, ktorý bude schopný analyzovať ich výsledky. Navyše ich veľmi ťažko možno kombinovať — počas behu možno neraz zistiť výsledok len jedného ladiaceho výrazu, a programy preplnené printlnami povedú k scrollovacej slepote.

Testy vytvárané pomocou JUnitu nevyžadujú na vyhodnotenie ľudský faktor a možno ich spúšťať súčasne. Ak potrebujete niečo otestovať, urobíte nasledovné:

  1. označte metódu anotáciou @org.junit.Test
  2. ak chcete overiť výsledok nejakej hodnoty, použite statický import:

    import static org.junit.Assert.*
    

    následne zavolajte metódu assertTrue(), do ktorej vložíte booleovskú hodnotu, ktorá má byť splnená (true), ak test uspeje.

Ak chcete otestovať súčet dvoch peňažných obnosov, viete, že výsledkom má byť súčet ich hodnôt, pričom menová jednotka sa zachová, môžete napísať takýto test:

@Test
public void jednoducheScitanie() {
    Obnos o12CHF = new Obnos(12, "CHF"); 
    Obnos o14CHF = new Obnos(14, "CHF"); 
    Obnos očakávanýObnos = new Obnos(26, "CHF"); 
    Obnos výsledok = m12CHF.pripocitaj(m14CHF); 
    assertTrue(očaqkávanýObnos.equals(výsledok));
}

Ak chcete vytvárať viacero testov, ktoré sa vzájomne podobaju, je lepšie pripraviť si niekoľko fixtures, teda objektov predstavujúcich “inventár” testov.

Fixtures / inventár

Čo ak viacero testov pracuje na rovnakej alebo podobnej sade objektov?

Testy potrebujú bežať na základe známej sady objektov, ktorú nazývame fixture (alebo inventár.) Pri písaní testov často zistíte, že viac času zaberie programovanie inventára než tvorba samotných testov.

Tvorbu kódu pre inventár môžete do istej miery uľahčiť vhodnou voľbou konštruktorov v testovaných triedach. Ešte väčšiu úsporu programátorského času však získate zdieľaním kódu inventára, teda v prípadoch, že rovnaký inventár využijete vo viacerých testoch. Každý testovací prípad využije odlišné metódy objektov inventára, prípadne ich zavolá s odlišnými parametrami a overí odlišné výsledky.

Objekty inventára môžete pripraviť nasledovne:

  1. Pre každý objekt inventára vytvorte inštančnú premennú.
  2. Objekty inventára vytvorte v metóde, ktorú označte anotáciou org.junit.Before, a priraĎte ich do inštančných premenných. Tradične sa táto metóda volá setUp()
  3. Vytvorte metódu označenú anotáciou org.junit.After, kde uvoľnite prostriedky a zdroje alokované v metóde setUp().

Ak chcete napríklad vytvárať viacero testovacích prípadov, ktoré pracujú s rozličnými kombináciami obnosov dvanástich frankov, štrnástich frankov a 28 amerických dolárov, vytvorte inventár:

public class ObnosTest {
    private Obnos o12CHF;
    private Obnos o14CHF;
    private Obnos o28USD;

    @Befire
    public void setUp() {
        o12CHF = new Obnos(12, "CHF");
        o14CHF = new Obnos(14, "CHF");
        o28USD = new Obnos(28, "USD");
    }
}

Ak máte hotový inventár, môžete prejsť k vytváraniu metód testovacích prípadov: dodajte toľko metód anotovaných pomocou @Test, koľko je treba.

Spúšťanie testov

Ako spustíte testy a zistíte ich výsledky?

Prirodzene, ak máte napísané testy, chcete ich spustiť. *JUnit poskytuje nástroje, ktoré umožňujú spustiť sadu testov a zobraziť ich výsledky. Ak chcete spúšťať testy z príkazového riadka, vytvorte klasickú triedu s metódou main() a zavolajte:

org.junit.runner.JUnitCore.runClasses(ObnosTest.class);

To môžete spraviť aj priamo z príkazového riadka: stačí, že testovacia trieda a knižnica JUnitu sú v premennej prostredia CLASSPATH:

java org.junit.runner.JUnitCore ObnosTest [...ostatné testovacie triedy...]

Ak chcete sprístupniť testovacie triedy aj pre triedu TestRunner zo staršej verzie *JUnitu, vytvorte statickú metódu suite(), ktorá vráti inštanciu testu:

public static junit.framework.Test suite() { 
    return new JUnit4TestAdapter(ObnosTest.class); 
}

Očakávané výnimky

Ako možno overiť kód, ktorý hádže výnimky, ktoré sú očakávané?

Overovanie, že kód dobehne v poriadku, je len jednou časťou programovania. Rovnako dôležité je však aj overenie, že kód sa správa podľa očakávaní aj v prípade chybových situácií. Napríklad:

new ArrayList<Object>().get(0);

Tento kód by mal hodiť výnimku IndexOutOfBoundsException.

Anotácia @Test má voliteľný parameter expected, ktorý očakáva podtriedy java.lang.Throwable. Ak chceme overiť, že ArrayList hodí očakávanú výnimku, napíšme:

@Test(expected=IndexOutOfBoundsException.class) 
public void prázdnyZoznam() { 
    new ArrayList<Object>().get(0); 
}

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *