4it101»J Unit 7

J Unit 7

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říkladtechnika
hádání číselgenerování předem známé posloupnosti
pole s náhodným obsahem na začátku,fake object
kostkapouž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