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 strany | getStranaA() | obvod() | obsah() |
5 | 5 | 20 | 25 |
0.1 | 0.1 | 0.4 | 0.01 |
-2 | -2 | Double.NaN | Double.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í.
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.