4it101»J Unit 4

J Unit 4

Přehled metod třídy Assert

1. Přehled metod

Porovnávání hodnot

assertEquals(long expected, long actual)
porovnání očekávané a skutečné hodnoty - celá čísla
assertEquals(double expected, double actual, double delta)
porovnání očekávané a skutečné hodnoty - reálná čísla
assertTrue(boolean condition)
ověření, že podmínka vrací true,
assertFalse(boolean condition)
ověření, že podmínka vrací false

Porovnávání instancí

assertEquals(Object expected, Object actual)
porovnání očekávané a skutečné instance pomocí metody equals,
assertSame(Object expected, Object actual)
očekávaná a skutečná instance musí být totožné (porovnání pomocí ==),
assertNotSame(Object unexpected, Object actual)
očekávaná a skutečná instance musí být různé (porovnání pomocí !=),
assertNull(Object object)
ověření, že parametr je roven null,
assertNotNull(Object object)
ověření, že parametr je různý od null,

Porovnávání polí

assertArrayEquals(char[] expecteds, char[] actuals)
porovnání pole očekávaných a vrácených hodnot typu char (znaky)
assertArrayEquals(double[] expecteds, double[] actuals, double delta)
porovnání pole očekávaných a vrácených hodnot typu double
assertArrayEquals(int[] expecteds, int[] actuals)
porovnání pole očekávaných a vrácených hodnot typu int
assertArrayEquals(long[] expecteds, long[] actuals)
porovnání pole očekávaných a vrácených hodnot typu long
assertArrayEquals(Object[] expecteds, Object[] actuals)
porovnání pole očekávaných a vrácených instancí typu objekt, pro porovnání se používá metoda equals,

Rozšířené testy

assertThat(T actual, Matcher<T> matcher)
ověření, že výraz odpovídá zadanému výrazu

Metoda fail

fail(String message)
selhání testu s identifikační zprávou

U metod nejsou uvedeny varianty s identifikační zprávou popisující porovnání.


2. Porovnání hodnot - assertEquals

assertEquals(long expected, long actual)
porovnání očekávané a skutečné hodnoty - celá čísla
assertEquals(double expected, double actual, double delta)
porovnání očekávané a skutečné hodnoty - reálná čísla

Ukázka použítí assertEquals pro typ double

Test větší než, menší než:

    assertEquals(true, kostka.hod() <= 6);
    # zvyraznit do bloku
    # chybně navržený test, pokud potřebujete testovat větší než či menší než,
assertTrue(boolean condition)
ověření, že podmínka vrací true,
assertFalse(boolean condition)
ověření, že podmínka vrací false

3. Porovnání instancí - assertEquals, assertSame, assertNull

Metoda assertEquals při porovnání očekáváné a skutečné hodnoty používá metodu equals. Je proto vhodné, aby třída deklarující typ porovnávané hodnoty měla správně nadeklarovanou tuto metodu. Porovnávání seznamů (List, Set, Map, ...) pomocí metody assertEquals v sobě skrývá záludnosti?.

Pokud chcete mít jistotu, že se jedná o stejné instanci, použijte metodu assertSame - porovnávají se adresy instancí pomocí operátoru ==. Rozdílnou identitu lze otestovat pomocí assertNotSame.

Pokud nějaká metoda má vrátit hodnotu null, můžete to otestovat pomocí

       assertEquals(null, testovanaMetoda());

Lze použít též zkrácený výraz pomocí metody

       assertNull(testovanaMetoda());

Pokud někdy postačuje ověřit, že metoda nevrací hodnotu null, lze použít metodu assertNotNull.


4. Identifikace porovnání - parametr message v assert*

Všechny metody assert* mohou mít jako první parametr textovou zprávu, která identifikuje konkrétní porovnání a která se vypisuje v případě selhání. Identifikační zpráva se většinou neuvádí, chybová zpráva vygenerovaná knihovnou JUnit je obvykle postačující. Identifikační zpráva by se měla zadat, pokud porovnáváte uvnitř cyklu, neboť jinak nelze poznat, při kterém průchodu vzniklo selhání. Ukážeme si to na testech třídy Ctverec. Máme následující tabulku správných výsledků:

délka stranygetStranaA()obvod()obsah()
552025
0.10.10.40.01
-2-2Double.NaNDouble.NaN

Tuto tabulku přepíšeme do dvourozměrného pole v testovací třídě:

    private double [][] poleHodnot = {
          // strana, getStranaA, obvod, obsah
            {     5,     5,         20,         25 },
            {   0.1,   0.1,        0.4,       0.01 },
            {    -2,    -2, Double.NaN, Double.NaN },
        };

a nyní můžeme vytvořit testovací metodu, která bude v cyklu procházet jednotlivé řádky pole:

    @Test
    public void testHodnot() {
        for (int rada = 0; rada < poleHodnot.length; rada++ ) {
            double stranaA = poleHodnot[rada][0];
            Ctverec ctverec = new Ctverec(stranaA);
            assertEquals("strana " + stranaA +", getStranaA() :",
                    poleHodnot[rada][1], ctverec.getStranaA(), 0.000001);
            assertEquals("strana " + stranaA +", obvod() :",
                    poleHodnot[rada][2], ctverec.obvod(), 0.000001);
            assertEquals("strana " + stranaA +", obsah() :",
                    poleHodnot[rada][3], ctverec.obsah(), 0.000001);
        }
    }

Následuje ukázka selhání testů (nejsou ošetřeny záporné hodnoty) - v dolním okně se na začátku vypíše identifikační zpráva porovnání.

Selhání testů s identifikací
BlueJ - selhání testů s identifikací

5. Metoda fail

Zavoláním metody fail oznámíte, že test neuspěl. Používá se v situacích, kdy Vám pro vyjádření úspěchu/neúspěchu nepostačují možnosti metod assert*. Lze použít při testování výjimek, jiné využití má při testech větší než či když postačuje přibližná shoda. U metody fail by se vždy měla uvést identifikační zpráva popisující důvod selhání.

V následujícím testu v metodou fail ověřujeme, že se generuje náhodné číslo v rozsahu <0..10).

    @Test
    public void testNahoda() {
        Random generator = new Random();
        int pokusu = 100;
        for (int i = 0; i < pokusu; i++) {
            int nCislo = generator.nextInt(10);
            if (nCislo < 0 || nCislo >= 10) {
                fail("náhodné číslo je mimo rozsah <0..10), pokus číslo " + i);
            }
        }
    }

Stejný test lze napsat i s metodou assertFalse:

        assertFalse("náhodné číslo je mimo rozsah <0..10), pokus číslo " + i ,
            nCislo < 0 || nCislo >= 10);

Upozornění - tyto testy na náhodná čísla nejsou dostačující, neboť z charakteru náhodných čísel vyplývá, že případné narušení by mělo být náhodné - např. až v milióntém pokusu.