Ein Leitfaden für @RepeatedTest in Junit 5

Eine Anleitung zu @RepeatedTest in Junit 5

1. Überblick

In diesem kurzen Artikel werden wir uns die in JUnit 5 eingeführte Annotation@RepeatedTestansehen. Es bietet uns eine leistungsstarke Möglichkeit, jeden Test zu schreiben, den wir mehrmals wiederholen möchten.

Wenn Sie mehr über JUnit 5 erfahren möchten, lesen Sie bitte unsere anderen Artikelexplaining the basics undguide to JUnit 5.

2. Maven-Abhängigkeiten und Setup

Als erstes ist zu beachten, dass JUnit 5 Java 8 zum Ausführen benötigt. Schauen wir uns die Maven-Abhängigkeit an:


    org.junit.jupiter
    junit-jupiter-engine
    5.1.0
    test

Dies ist die Hauptabhängigkeit von JUnit 5, die zum Schreiben unserer Tests hinzugefügt werden muss. Schauen Sie sich die neueste Version des Artefaktshere an.

3. Ein einfaches Beispiel für@RepeatedTest

Das Erstellen eines wiederholten Tests ist einfach - fügen Sie einfach die Annotation@RepeatedTestüber der Testmethode hinzu:

@RepeatedTest(3)
void repeatedTest(TestInfo testInfo) {
    System.out.println("Executing repeated test");

    assertEquals(2, Math.addExact(1, 1), "1 + 1 should equal 2");
}

Beachten Sie, dass wir anstelle der Standardanmerkung@Test@RepeatedTest für unseren Komponententest verwenden. The above test will be executed three times, als ob der gleiche Test dreimal geschrieben worden wäre.

Die Testberichte (die Berichtsdateien oder die Ergebnisse auf der Registerkarte JUnit Ihrer IDE) zeigen alle Ausführungen an:

repetition 1 of 3(repeatedTest(TestInfo))
repetition 2 of 3(repeatedTest(TestInfo))
repetition 3 of 3(repeatedTest(TestInfo))

4. Lebenszyklusunterstützung für@RepeatedTest

Each execution of the @RepeatedTest will behave like a regular @Test mit vollständiger Unterstützung des JUnit-Testlebenszyklus. Dies bedeutet, dass bei jeder Ausführung die Methoden@BeforeEach und@AfterEach aufgerufen werden. Um dies zu demonstrieren, fügen Sie einfach die entsprechenden Methoden in die Testklasse ein:

@BeforeEach
void beforeEachTest() {
    System.out.println("Before Each Test");
}

@AfterEach
void afterEachTest() {
    System.out.println("After Each Test");
    System.out.println("=====================");
}

Wenn wir unseren vorherigen Test ausführen, werden die Ergebnisse auf der Konsole angezeigt:

Before Each Test
Executing repeated test
After Each Test
=====================
Before Each Test
Executing repeated test
After Each Test
=====================
Before Each Test
Executing repeated test
After Each Test
=====================

Wie wir sehen können, sind die@BeforeEach and @AfterEach methods are called around each execution.

5. Konfigurieren des Testnamens

Im ersten Beispiel haben wir festgestellt, dass die Ausgabe des Testberichts keine Bezeichner enthält. Dies kann mithilfe des Attributsnameweiter konfiguriert werden:

@RepeatedTest(value = 3, name = RepeatedTest.LONG_DISPLAY_NAME)
void repeatedTestWithLongName() {
    System.out.println("Executing repeated test with long name");

    assertEquals(2, Math.addExact(1, 1), "1 + 1 should equal 2");
}

Die Ausgabe enthält nun den Methodennamen zusammen mit dem Wiederholungsindex:

repeatedTestWithLongName() :: repetition 1 of 3(repeatedTestWithLongName())
repeatedTestWithLongName() :: repetition 2 of 3(repeatedTestWithLongName())
repeatedTestWithLongName() :: repetition 3 of 3(repeatedTestWithLongName())

Eine andere Option ist die Verwendung vonRepeatedTest.SHORT_DISPLAY_NAME, die den Kurznamen des Tests ergibt:

repetition 1 of 3(repeatedTestWithShortName())
repetition 2 of 3(repeatedTestWithShortName())
repetition 3 of 3(repeatedTestWithShortName())

Wenn wir jedoch unseren benutzerdefinierten Namen verwenden müssen, ist es sehr gut möglich:

@RepeatedTest(value = 3, name = "Custom name {currentRepetition}/{totalRepetitions}")
void repeatedTestWithCustomDisplayName(TestInfo testInfo) {
    assertEquals(2, Math.addExact(1, 1), "1 + 1 should equal 2");
}

Die{currentRepetition} und{totalRepetitions} sind die Platzhalter für die aktuelle Wiederholung und die Gesamtzahl der Wiederholungen. Diese Werte werden automatisch von JUnit zur Laufzeit bereitgestellt, und es ist keine zusätzliche Konfiguration erforderlich. Die Ausgabe ist ziemlich genau das, was wir erwartet hatten:

Custom name 1/3(repeatedTestWithCustomDisplayName())
Custom name 2/3(repeatedTestWithCustomDisplayName())
Custom name 3/3(repeatedTestWithCustomDisplayName())

6. Zugriff aufRepetitionInfo

Neben dem Attributname bietet JUnit auch Zugriff auf die Wiederholungsmetadaten in unserem Testcode. Dies wird erreicht, indem unserer Testmethode einRepetitionInfo-Parameter hinzugefügt wird:

@RepeatedTest(3)
void repeatedTestWithRepetitionInfo(RepetitionInfo repetitionInfo) {
    System.out.println("Repetition #" + repetitionInfo.getCurrentRepetition());

    assertEquals(3, repetitionInfo.getTotalRepetitions());
}

Die Ausgabe enthält den aktuellen Wiederholungsindex für jede Ausführung:

Repetition #1
Repetition #2
Repetition #3

RepetitionInfo wird durchRepetitionInfoParameterResolver bereitgestellt und ist nur im Kontext von@RepeatedTest. verfügbar

7. Fazit

In diesem kurzen Tutorial haben wir die von JUnit bereitgestellte Annotation@RepeatedTestuntersucht und verschiedene Konfigurationsmethoden kennengelernt.

Vergessen Sie nicht, diefull source code für diesen Artikel auf GitHub zu lesen.