Java >> Java tutorial >  >> Tag >> JUnit

Kør eller ignorer tests betinget i JUnit 4

1. Oversigt

Lad os forestille os, at vi har en test for noget kode, der afhænger af operativsystemet og kun bør køre, hvis vores testmaskine kører på Linux. Hvis det kører på et hvilket som helst andet OS, ønsker vi, at testen ikke mislykkes, men at den ignoreres under kørsel.

En første tilgang kunne være at bruge et par hvis sætninger for at kontrollere for denne tilstand ved hjælp af System klasseejendomme. Dette virker selvfølgelig, men JUnit har en renere og mere elegant metode.

I dette korte selvstudie skal vi se på hvordan vi betinget kan køre eller ignorere tests i JUnit 4 ved hjælp af Antag  klasse .

2. Antag Klasse

Denne klasse giver et sæt metoder til at understøtte betinget testudførelse baseret på visse betingelser . Vores test kører kun, hvis alle disse betingelser er opfyldt. Hvis ikke, vil JUnit bare springe dens udførelse over og markere den som bestået i testrapporten . Sidstnævnte er den største forskel med Assert klasse, hvor en fejltilstand fører til, at testen ender som ikke bestået .

En vigtig ting at bemærke er, at den adfærd, vi beskrev for Antag klasse er eksklusiv for standard JUnit-løberen . Med brugerdefinerede løbere kan tingene være anderledes.

Endelig på samme måde som med Bekræft , kan vi kalde Antag metoder enten i @Before eller @BeforeClass annoterede metoder eller inden for @Test  selve metoden.

Lad os nu gennemgå de mest nyttige metoder i Antag klasse ved at vise nogle eksempler. For alle de følgende eksempler, lad os antage getOsName() returnerer Linux.

2.1. Brug assumeThat

Den assumeThat() metoden kontrollerer, at tilstanden – i dette tilfælde getOsName() – opfylder betingelserne for matcheren bestået i:

@Test
public void whenAssumeThatAndOSIsLinux_thenRunTest() {
    assumeThat(getOsName(), is("Linux"));

    assertEquals("run", "RUN".toLowerCase());
}

I dette eksempel kontrollerede vi, om getOsName() er lig med Linux . Som getOsName() returnerer Linux , vil testen blive kørt . Bemærk, vi bruger Hamcrest-matchermetoden is(T) som matcheren her.

2.2. Brug af assumeTrue

På samme måde kan vi bruge assumeTrue() metode til at angive et boolesk udtryk, der skal evalueres til sandt for at testen kan køre. Hvis den evalueres til falsk , vil testen blive ignoreret:

private boolean isExpectedOS(String osName) {
    return "Linux".equals(osName);
}

@Test 
public void whenAssumeTrueAndOSIsLinux_thenRunTest() {
    assumeTrue(isExpectedOS(getOsName()));
 
    assertEquals("run", "RUN".toLowerCase());
}

I dette tilfælde isExpectedOs() returnerer sand . Derfor er den betingelserne for at testen kan køre er opfyldt, og testen vil blive kørt .

2.3. Brug af assumeFalse

Endelig kan vi bruge det modsatte assumeFalse() metode til at angive et boolesk udtryk, der skal evalueres til falsk for at testen kan køre. Hvis det vurderes til sandt , vil testen blive ignoreret:

@Test
public void whenAssumeFalseAndOSIsLinux_thenIgnore() {
    assumeFalse(isExpectedOS(getOsName()));

    assertEquals("run", "RUN".toLowerCase());
}

I dette tilfælde, som isExpectedOs() også returnerer sandt, den betingelserne for at testen kan køre er ikke opfyldt, og testen vil blive ignoreret .

2.4. Brug af assumeNotNull

Når vi vil ignorere en test, hvis et udtryk er null, vi kan bruge assumeNotNull() metode:

@Test
public void whenAssumeNotNullAndNotNullOSVersion_thenRun() {
    assumeNotNull(getOsName());

    assertEquals("run", "RUN".toLowerCase());
}

Som getOsName() returnerer en ikke-nul værdi, er betingelsen for, at testen kan køre, opfyldt, og testen vil køre.

2.5. Brug af assumeNoException

Endelig kunne vi ønske at ignorere en test, hvis en undtagelse er kastet. Vi kan bruge assumeNoException() til dette formål:

@Test
public void whenAssumeNoExceptionAndExceptionThrown_thenIgnore() {
    assertEquals("everything ok", "EVERYTHING OK".toLowerCase());
    String t=null;
    try {
        t.charAt(0);
    } catch(NullPointerException npe){
        assumeNoException(npe);
    }
    assertEquals("run", "RUN".toLowerCase());
}

I dette eksempel, som t er nul, en NullPointerException undtagelse er kastet, derfor den betingelserne for at testen kan køre er ikke opfyldt, og testen vil blive ignoreret .

3. Hvor skal vi placere assumeXXX Ring?

Det er vigtigt at bemærke, at adfærden af ​​assumeXXX metoder afhænger af, hvor vi placerer dem i vores test .

Lad os ændre vores assumeThat lidt eksempel, så assertEquals() opkaldet går først. Lad os også lave assertEquals() mislykkes:

@Test
public void whenAssumeFalseAndOSIsLinux_thenIgnore() {
    assertEquals("run", "RUN");
    assumeFalse(isExpectedOS(getOsName()));
}

Når vi kører dette eksempel, har vi:

org.junit.ComparisonFailure: 
Expected :run
Actual   :RUN

I dette tilfælde ignoreres vores test ikke, fordi den har fejlet, før vi nåede assumeThat() ring. Det samme sker med alle assumeXXX metoder. Så vi skal sørge for, at vi placerer dem det rigtige sted i vores testmetode .

4. Konklusion

I dette korte selvstudie har vi set, hvordan vi betinget kan beslutte, om en test skal køre eller ej, ved hjælp af Antag klasse i JUnit 4. Hvis vi bruger JUnit 5, er den også tilgængelig i version 5.4 eller nyere .

Som altid kan kildekoden til de eksempler, vi har været igennem, findes på GitHub.


Java tag