Testování náhody
Při testování metod instance nějaké třídy se snažíme minimalizovat vlivy ostatních tříd - nejlépe testovat samotnou třídu v předem připravených "umělých" stavech.
Pokud testovaná třída používá generátor náhodných tříd, je potřeba obejít generátor náhodných čísel a vytvořit stav instance, ve které se má testovat. Občas je vhodné otestovat, že generátor náhodných čísel funguje - že různé instance mají různé náhodné hodnoty.
V testech neexistuje něco jako 99% úspěch. Je pouze a jenom úspěch a nebo ne. Interpretace typu ten test občas selže, to je ok, je jenom lhaní si do kapsy.
Převzato z Dabglog.
|
Náhodnost můžeme v testech obejít různými postupy (technikami], tři si popíšeme v následujících příkladech. Techniky lze různě kombinovat či upravovat.
příklad | technika |
hádání čísel | generování předem známé posloupnosti |
pole s náhodným obsahem na začátku, | fake object |
kostka | použití makety |
Známá posloupnost - Hádání čísel
aplikace (třída) si vymyslí náhodné náhodné číslo z intervalu 0 až 99. Úkolem hráče je číslo uhodnout.
Fake object - Náhodně generované pole
Tento příklad vychází ze zadání úkolu poleMincí a navazuje na popis testování polí. Nutným předpokladem je, že třída Mince obsahuje správně naprogramovanou metodu equals.
Pokud máte variantu hry s náhodně generovaným rozložením mincí v poli (varianta 2), tak můžete pouze testovat, že při vytvoření dvou instancí hry se vrací různá pole. Otestování většiny pravidel bez znalosti počátečního rozložení mincí je nemožné.
Pro vytvoření testů v této situaci se používá více technik, v naší situaci je nejvhodnější podvrhnout vlastní předpřipravené pole (této technice se říká Fake Object).
V testované třídě Hra2 vytvoříme ještě druhý konstruktor, který bude mít jako parametr pole mincí. Tj. pole mincí se nebude náhodně generovat, ale přiřadí se přes konstruktor:
public class Hra2 implements IHra {
private Mince [] poleMinci;
public Hra2 () { // konstruktor použitý z grafiky
poleMinci = new Mince[20];
// ... náhodné obsazení pole mincemi ...
}
public Hra2(Mince [] pole) { // konstruktor pro testy
this.poleMinci = pole;
}
// ... zbytek tridy
V testovací třídě si připravíme metodu pro počáteční pole (rozmístění mincí může být odlišné, asi by jich mělo být více):
private Mince [] pocatecniPole() {
Mince [] poleMinci = new Mince[20];
poleMinci[3] = new Mince("stříbrná", "coin.png");
poleMinci[5] = new Mince("zlatá", "coin_gold.png");
poleMinci[7] = new Mince("stříbrná", "coin.png");
poleMinci[10] = new Mince("stříbrná", "coin.png");
return poleMinci;
}
a test by vypadal takto:
@Test
public void testTahHrace1() {
Hra2 hra = new Hra2( pocatecniPole() );
Tah tah = new Tah(3, 0);
assertEquals(false, hra.tahHrace(tah));
assertArrayEquals( pocatecniPole(), hra.getPoleMinci());
}
V testu je při porovnání použito pocatecniPole, protože při chybném tahu by nemělo dojít ke změně. V některých testech si musíte vytvořit odlišná pole - opět nejlépe pomocí jednotlivých privátních metod.
Maketa - Kostka