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é println
ami 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é:
- označte metódu anotáciou
@org.junit.Test
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:
- Pre každý objekt inventára vytvorte inštančnú premennú.
- 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()
- Vytvorte metódu označenú anotáciou
org.junit.After
, kde uvoľnite prostriedky a zdroje alokované v metódesetUp()
.
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);
}