Un guide sur @RepeatedTest en juin 5

1. Vue d'ensemble

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

Si vous souhaitez en savoir plus sur JUnit 5, veuillez consulter nos autres articles expliquant les bases et le guide de JUnit 5.

2. Dépendances et configuration de Maven

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

 org.junit.jupiter junit-jupiter-engine 5.7.0 test 

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

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 @Test standard , nous utilisons @RepeatedTest pour notre test unitaire. Le test ci-dessus sera exécuté trois fois 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

Chaque exécution de @RepeatedTest se comportera comme un @Test normal 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 méthodes @BeforeEach et @AfterEach sont appelées autour de chaque exécution .

5. Configuration du nom du test

Dans le premier exemple, nous avons observé que la sortie du rapport de test ne contient aucun identifiant. Cela peut être configuré ultérieurement à l'aide de l' attribut name :

@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 désormais 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 à utiliser RepeatedTest.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é, c'est tout à fait possible:

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

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

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

6. Accès à RepetitionInfo

Outre l' attribut name , 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ètre RepetitionInfo à 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 chacune des exécutions:

Repetition #1 Repetition #2 Repetition #3

Le RepetitionInfo est fourni par RepetitionInfoParameterResolver et n'est disponible que dans le contexte de @RepeatedTest.

7. Conclusion

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

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