Una guida a @RepeatedTest del 5 giugno

1. Panoramica

In questo rapido articolo, esamineremo l' annotazione @RepeatedTest introdotta in JUnit 5. Ci fornisce un modo potente per scrivere qualsiasi test che vogliamo ripetere più volte.

Se vuoi saperne di più su JUnit 5, controlla i nostri altri articoli che spiegano le basi e la guida a JUnit 5.

2. Dipendenze e installazione di Maven

La prima cosa da notare è che JUnit 5 necessita di Java 8 per funzionare. Detto questo, diamo un'occhiata alla dipendenza da Maven:

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

Questa è la dipendenza principale di JUnit 5 che dobbiamo aggiungere per scrivere i nostri test. Controlla l'ultima versione del manufatto qui.

3. Un semplice esempio di @RepeatedTest

Creare un test ripetuto è semplice: aggiungi l' annotazione @RepeatedTest sopra il metodo di test:

@RepeatedTest(3) void repeatedTest(TestInfo testInfo) { System.out.println("Executing repeated test"); assertEquals(2, Math.addExact(1, 1), "1 + 1 should equal 2"); }

Nota che invece dell'annotazione @Test standard , stiamo usando @RepeatedTest per il nostro unit test. Il test di cui sopra verrà eseguito tre volte come se lo stesso test fosse stato scritto tre volte.

I rapporti di prova (i file di rapporto oi risultati nella scheda JUnit del tuo IDE) mostreranno tutte le esecuzioni:

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

4. Supporto del ciclo di vita per @RepeatedTest

Ogni esecuzione di @RepeatedTest si comporterà come un normale @Test con supporto completo del ciclo di vita del test JUnit. Significa che, durante ogni esecuzione, verranno chiamati i metodi @BeforeEach e @AfterEach . Per dimostrarlo, aggiungi semplicemente i metodi appropriati nella classe di test:

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

Se eseguiamo il nostro test precedente, i risultati verranno visualizzati sulla 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 =====================

Come possiamo vedere, i metodi @BeforeEach e @AfterEach vengono chiamati attorno a ciascuna esecuzione .

5. Configurazione del nome del test

Nel primo esempio, abbiamo osservato che l'output del rapporto di prova non contiene identificatori. Questo può essere ulteriormente configurato utilizzando l' attributo 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"); }

L'output conterrà ora il nome del metodo insieme all'indice di ripetizione:

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

Un'altra opzione è usare RepeatedTest.SHORT_DISPLAY_NAME che produrrà il nome breve del test:

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

Se, tuttavia, dobbiamo utilizzare il nostro nome personalizzato, è assolutamente possibile:

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

Il {currentRepetition} e {} totalRepetitions sono i segnaposti per la ripetizione corrente e il numero totale di ripetizioni. Questi valori vengono forniti automaticamente da JUnit in fase di esecuzione e non è richiesta alcuna configurazione aggiuntiva. L'output è praticamente quello che ci aspettavamo:

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

6. Accesso a RepetitionInfo

Oltre all'attributo name , JUnit fornisce l'accesso ai metadati di ripetizione anche nel nostro codice di test. Ciò si ottiene aggiungendo un parametro RepetitionInfo al nostro metodo di test:

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

L'output conterrà l'indice di ripetizione corrente per ciascuna esecuzione:

Repetition #1 Repetition #2 Repetition #3

Il RepetitionInfo è fornito da RepetitionInfoParameterResolver ed è disponibile solo nel contesto di @RepeatedTest.

7. Conclusione

In questo breve tutorial, abbiamo esplorato l' annotazione @RepeatedTest fornita da JUnit e abbiamo imparato diversi modi per configurarla.

Non dimenticare di controllare il codice sorgente completo di questo articolo su GitHub.