Guide de @RepeatedTest dans Junit 5

Un guide sur @RepeatedTest dans Junit 5

1. Vue d'ensemble

Dans cet article rapide, nous allons examiner l'annotation@RepeatedTest introduite dans JUnit 5. Il nous fournit un moyen puissant d’écrire tout test que nous voulons répéter plusieurs fois.

Si vous souhaitez en savoir plus sur JUnit 5, veuillez consulter nos autres articlesexplaining the basics etguide to JUnit 5.

2. Dépendances et configuration de Maven

La première chose à noter est que JUnit 5 nécessite Java 8 pour fonctionner. Cela dit, jetons un coup d'œil à la dépendance Maven:


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

C’est la dépendance principale de JUnit 5 que nous devons ajouter pour écrire nos tests. Découvrez la dernière version de l'artefacthere.

3. Un exemple simple de@RepeatedTest

Créer un test répété est simple - ajoutez simplement l'annotation@RepeatedTest au-dessus de la méthode de test:

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

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

Notez qu'au lieu de l'annotation standard@Test, nous utilisons@RepeatedTest pour notre test unitaire. The above test will be executed three times comme si le même test avait été écrit trois fois.

Les rapports de test (les fichiers de rapport ou les résultats dans l'onglet JUnit de votre IDE) afficheront toutes les exécutions:

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

4. Prise en charge du cycle de vie pour@RepeatedTest

Each execution of the @RepeatedTest will behave like a regular @Test ayant une prise en charge complète du cycle de vie des tests JUnit. Cela signifie que lors de chaque exécution, les méthodes@BeforeEach et@AfterEach seront appelées. Pour illustrer cela, ajoutez simplement les méthodes appropriées dans la classe de test:

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

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

Si nous exécutons notre test précédent, les résultats seront affichés sur la console:

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
=====================

Comme nous pouvons le voir, les@BeforeEach and @AfterEach methods are called around each execution.

5. Configuration du nom du test

Dans le premier exemple, nous avons observé que la sortie du rapport de test ne contient aucun identifiant. Ceci peut être configuré plus loin en utilisant l'attributname:

@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");
}

La sortie contiendra maintenant le nom de la méthode avec l'index de répétition:

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

Une autre option consiste à utiliserRepeatedTest.SHORT_DISPLAY_NAME qui produira le nom court du test:

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

Si toutefois, nous devons utiliser notre nom personnalisé, il est très possible:

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

Les{currentRepetition} et{totalRepetitions} sont les espaces réservés pour la répétition actuelle et le nombre total de répétitions. Ces valeurs sont fournies automatiquement par JUnit au moment de l'exécution et aucune configuration supplémentaire n'est requise. Le résultat correspond à peu près à ce que nous attendions:

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

6. Accéder auxRepetitionInfo

Outre l'attributname, JUnit permet également d'accéder aux métadonnées de répétition dans notre code de test. Ceci est réalisé en ajoutant un paramètreRepetitionInfo à notre méthode de test:

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

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

La sortie contiendra l'index de répétition actuel pour chaque exécution:

Repetition #1
Repetition #2
Repetition #3

LeRepetitionInfo est fourni parRepetitionInfoParameterResolver et n'est disponible que dans le contexte de@RepeatedTest.

7. Conclusion

Dans ce rapide tutoriel, nous avons exploré l'annotation@RepeatedTest fournie par JUnit et appris différentes façons de la configurer.

N'oubliez pas de consulter lesfull source code de cet article sur GitHub.