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

JUnit 5 TestWatcher API

1. Oversigt

Ved enhedstestning kan vi med jævne mellemrum ønske at behandle resultaterne af vores testmetodeudførelser. I denne hurtige tutorial skal vi se på, hvordan vi kan opnå dette ved hjælp af TestWatcher API leveret af JUnit .

For en dybdegående guide til test med JUnit, se vores fremragende guide til JUnit 5.

2. TestWatcher API

Kort sagt, TestWatcher grænsefladen definerer API'en for udvidelser, der ønsker at behandle testresultater . En måde, vi kan tænke på denne API, er at give kroge til at få status for en individuel testcase.

Men før vi dykker ned i nogle rigtige eksempler, lad os tage et skridt tilbage og kort opsummere metoderne i TestWatcher grænseflade :

  • testAborted​(ExtensionContext context, Throwable cause)

    For at behandle resultaterne af en afbrudt test kan vi tilsidesætte testAborted metode. Som navnet antyder, aktiveres denne metode, efter at en test er blevet afbrudt.

  • testDisabled​(ExtensionContext context, Optional reason)

    Vi kan tilsidesætte testDisabled metode, når vi ønsker at håndtere resultaterne af en deaktiveret testmetode. Denne metode kan også omfatte årsagen til, at testen er deaktiveret.

  • testFailed(ExtensionContext context, Throwable cause)

    Hvis vi ønsker at udføre yderligere behandling efter en testfejl, kan vi blot implementere funktionaliteten i testFailed metode. Denne metode kan omfatte årsagen til testfejlen.

  • testSuccessful(ExtensionContext context)

    Sidst men ikke mindst, når vi ønsker at behandle resultaterne af en vellykket test, tilsidesætter vi simpelthen testen vellykket metode.

Vi skal bemærke, at alle metoderne indeholder ExtensionContext . Dette indkapsler den kontekst, som den aktuelle test blev udført i.

3. Maven Dependencies

Lad os først og fremmest tilføje de projektafhængigheder, vi skal bruge til vores eksempler.
Ud over JUnit 5-hovedbiblioteket junit-jupiter-engine , skal vi også bruge junit-jupiter-api bibliotek:

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.8.1</version>
    <scope>test</scope>
</dependency>

Som altid kan vi få den seneste version fra Maven Central.

4. En TestResultLoggerExtension Eksempel

Nu hvor vi har en grundlæggende forståelse af TestWatcher API, vil vi gennemgå et praktisk eksempel.

Lad os starte med at oprette en simpel udvidelse til at logge resultaterne og give en oversigt over vores tests . I dette tilfælde skal vi for at oprette udvidelsen definere en klasse, der implementerer TestWatcher grænseflade:

public class TestResultLoggerExtension implements TestWatcher, AfterAllCallback {
    private List<TestResultStatus> testResultsStatus = new ArrayList<>();

    private enum TestResultStatus {
        SUCCESSFUL, ABORTED, FAILED, DISABLED;
    }

    //...
}

Som med alle udvidelsesgrænseflader er TestWatcher grænsefladen udvider også hoved-udvidelsen grænseflade , som kun er en markørgrænseflade. I dette eksempel implementerer vi også AfterAllCallback grænseflade.

I vores udvidelse har vi en liste over TestResultStatus , som er en simpel opregning, vi skal bruge til at repræsentere status for et testresultat.

4.1. Behandling af testresultaterne

Lad os nu se, hvordan resultaterne af den individuelle enhedstestmetode behandles:

@Override
public void testDisabled(ExtensionContext context, Optional<String> reason) {
    LOG.info("Test Disabled for test {}: with reason :- {}", 
      context.getDisplayName(),
      reason.orElse("No reason"));

    testResultsStatus.add(TestResultStatus.DISABLED);
}

@Override
public void testSuccessful(ExtensionContext context) {
    LOG.info("Test Successful for test {}: ", context.getDisplayName());

    testResultsStatus.add(TestResultStatus.SUCCESSFUL);
}  

Vi begynder med at udfylde brødteksten i vores udvidelse og tilsidesætte testDisabled() og testSuccessful() metoder .

I vores trivielle eksempel udlæser vi navnet på testen og tilføjer testens status til testresultatstatus liste.

Vi fortsætter på denne måde for de to andre metoder - testAborted() og testFailed() :

@Override
public void testAborted(ExtensionContext context, Throwable cause) {
    LOG.info("Test Aborted for test {}: ", context.getDisplayName());

    testResultsStatus.add(TestResultStatus.ABORTED);
}

@Override
public void testFailed(ExtensionContext context, Throwable cause) {
    LOG.info("Test Failed for test {}: ", context.getDisplayName());

    testResultsStatus.add(TestResultStatus.FAILED);
}

4.2. Opsummering af testresultaterne

I den sidste del af vores eksempel tilsidesætter vi afterAll() metode :

@Override
public void afterAll(ExtensionContext context) throws Exception {
    Map<TestResultStatus, Long> summary = testResultsStatus.stream()
      .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

    LOG.info("Test result summary for {} {}", context.getDisplayName(), summary.toString());
}

For hurtigt at opsummere, efterAlle metode udføres efter at alle testmetoder er blevet kørt. Vi bruger denne metode til at gruppere de forskellige TestResultStatus vi har på listen over testresultater, før vi udsender et meget grundlæggende resumé.

For en dybdegående guide til Lifecycle Callbacks, se vores fremragende guide til JUnit 5-udvidelser.

5. Kørsel af testene

I denne næstsidste sektion vil vi se, hvordan outputtet fra vores test ser ud ved hjælp af vores simple logningsudvidelse.

Nu hvor vi har defineret vores udvidelse, vil vi først registrere den ved hjælp af standarden @ExtendWith anmærkning:

@ExtendWith(TestResultLoggerExtension.class)
class TestWatcherAPIUnitTest {

    @Test
    void givenFalseIsTrue_whenTestAbortedThenCaptureResult() {
        Assumptions.assumeTrue(false);
    }

    @Disabled
    @Test
    void givenTrueIsTrue_whenTestDisabledThenCaptureResult() {
        Assert.assertTrue(true);
    }

    //...

Dernæst fylder vi vores testklasse med enhedstests og tilføjer en blanding af deaktiverede, afbrudte og vellykkede tests.

5.1. Gennemgang af output

Når vi kører enhedstesten, bør vi se output for hver test:

INFO  c.b.e.t.TestResultLoggerExtension - 
    Test Successful for test givenTrueIsTrue_whenTestAbortedThenCaptureResult()
...
Test result summary for TestWatcherAPIUnitTest {ABORTED=1, SUCCESSFUL=1, DISABLED=2}

Vi vil naturligvis også se oversigten udskrevet, når alle testmetoder er gennemført.

6. Gotchas

Lad os i dette sidste afsnit gennemgå et par af de finesser, vi bør være opmærksomme på, når vi arbejder med TestWatcher grænseflade:

  • TestWatcher-udvidelser har ikke tilladelse til at påvirke udførelsen af ​​tests; det betyder hvis en undtagelse kastes fra en TestWatcher , vil det ikke blive udbredt op til køretesten
  • I øjeblikket bruges denne API kun til at rapportere resultaterne af @Test metoder og @TestTemplate metoder
  • Som standard, hvis ingen årsag er angivet til testDisabled metode, så vil den indeholde det fuldt kvalificerede navn på testmetoden efterfulgt af "er @Deaktiveret '

7. Konklusion

For at opsummere har vi i denne vejledning vist, hvordan vi kan gøre brug af JUnit 5 TestWatcher API til at behandle resultaterne af vores testmetodeudførelser.

Den fulde kildekode for eksemplerne kan findes på GitHub.


Java tag