Tagging e filtraggio dei test JUnit

1. Panoramica

È molto comune eseguire automaticamente tutti i nostri test JUnit come parte della build CI utilizzando Maven. Questo, tuttavia, spesso richiede tempo.

Pertanto, spesso desideriamo filtrare i nostri test ed eseguire test unitari o test di integrazione o entrambi in varie fasi del processo di compilazione.

In questo tutorial, esamineremo alcune tecniche di filtraggio per casi di test con JUnit 5. Nelle sezioni seguenti, esamineremo anche vari meccanismi di filtraggio prima di JUnit 5.

2. Tag JUnit 5

2.1. Annotazione di test JUnit con tag

Con JUnit 5 possiamo filtrare i test taggando un sottoinsieme di essi con un nome di tag univoco. Ad esempio, supponiamo di avere sia test unitari che test di integrazione implementati utilizzando JUnit 5. Possiamo aggiungere tag su entrambi i set di casi di test:

@Test @Tag("IntegrationTest") public void testAddEmployeeUsingSimpelJdbcInsert() { } @Test @Tag("UnitTest") public void givenNumberOfEmployeeWhenCountEmployeeThenCountMatch() { }

D'ora in poi possiamo eseguire separatamente tutti i test con un particolare nome di tag . Possiamo anche taggare la classe invece dei metodi. Includendo così tutti i test in una classe sotto un tag.

Nelle prossime sezioni vedremo vari modi di filtrare ed eseguire i test JUnit contrassegnati.

2.2. Filtraggio dei tag con Test Suite

JUnit 5 ci consente di implementare suite di test attraverso le quali possiamo eseguire casi di test con tag:

@RunWith(JUnitPlatform.class) @SelectPackages("com.baeldung.tags") @IncludeTags("UnitTest") public class EmployeeDAOUnitTestSuite { }

Ora, se eseguiamo questa suite, verranno eseguiti tutti i test JUnit sotto il tag UnitTest . Allo stesso modo, possiamo escludere test con l' annotazione ExcludeTags .

2.3. Filtraggio dei tag con il plugin Maven Surefire

Per filtrare i test JUnit nelle varie fasi della build di Maven, possiamo utilizzare il plugin Maven Surefire. Il plug-in Surefire ci consente di includere o escludere i tag nella configurazione del plug-in :

 maven-surefire-plugin 2.20.1  UnitTest  

Se ora eseguiamo questo plugin, eseguirà tutti i test contrassegnati come UnitTest. Allo stesso modo, possiamo escludere casi di test sotto un nome di tag:

IntegrationTest

2.4. Filtrare i tag con un IDE

Gli IDE ora consentono di filtrare i test JUnit per tag. In questo modo possiamo eseguire un insieme specifico di test con tag direttamente dal nostro IDE.

IntelliJ consente tale filtraggio attraverso una configurazione di esecuzione / debug personalizzata:

Come mostrato in questa immagine, abbiamo selezionato il tipo di test come tag e il tag da eseguire nell'espressione tag.

JUnit 5 consente varie espressioni di tag che possono essere utilizzate per filtrare i tag. Ad esempio, per eseguire tutto tranne i test di integrazione, potremmo usare ! IntegrationTest come espressione tag. Oppure per eseguire sia UnitTest che IntegrationTest, possiamo usare UnitTest | IntegrationTest.

Allo stesso modo, Eclipse consente anche di includere o escludere tag nelle configurazioni Run / Debug di JUnit:

3. Categorie JUnit 4

3.1. Classificazione dei test JUnit

JUnit 4 ci consente di eseguire un sottoinsieme di test JUnit aggiungendoli in diverse categorie. Di conseguenza, possiamo eseguire i casi di test in una particolare categoria escludendo altre categorie.

Possiamo creare tante categorie implementando interfacce marker in cui il nome dell'interfaccia marker rappresenta il nome della categoria. Per il nostro esempio, implementeremo due categorie, UnitTest:

public interface UnitTest { }

e Test di integrazione:

public interface IntegrationTest { }

Ora possiamo classificare la nostra JUnit annotandola con l' annotazione di categoria :

@Test @Category(IntegrationTest.class) public void testAddEmployeeUsingSimpelJdbcInsert() { } @Test @Category(UnitTest.class) public void givenNumberOfEmployeeWhenCountEmployeeThenCountMatch() { }

Nel nostro esempio, inseriamo l' annotazione Category sui metodi di test. Allo stesso modo, possiamo anche aggiungere questa annotazione sulla classe di test, aggiungendo così tutti i test in una categoria.

3.2. Categorie Runner

Per eseguire i test JUnit in una categoria, dobbiamo implementare una classe suite di test:

@RunWith(Categories.class) @IncludeCategory(UnitTest.class) @SuiteClasses(EmployeeDAOCategoryIntegrationTest.class) public class EmployeeDAOUnitTestSuite { }

Questa suite di test può essere eseguita da un IDE ed eseguirà tutti i test JUnit nella categoria UnitTest . Allo stesso modo, possiamo anche escludere una categoria di test nella suite:

@RunWith(Categories.class) @ExcludeCategory(IntegrationTest.class) @SuiteClasses(EmployeeDAOCategoryIntegrationTest.class) public class EmployeeDAOUnitTestSuite { }

3.3. Esclusione o inclusione di categorie in Maven

Infine, possiamo anche includere o escludere le categorie di test JUnit dalla build Maven. Pertanto, possiamo eseguire diverse categorie di test JUnit in diversi profili Maven.

Useremo il plugin Maven Surefire per questo:

 maven-surefire-plugin 2.20.1  com.baeldung.categories.UnitTest  

Allo stesso modo possiamo escludere una categoria dalla build Maven:

 maven-surefire-plugin 2.20.1  com.baeldung.categories.IntegrationTest  

Questo è simile all'esempio che abbiamo discusso nella sezione precedente. L'unica differenza è che abbiamo sostituito il nome del tag con il nome completo dell'implementazione della categoria .

4. Filtering JUnit Tests with Maven Surefire Plugin

Both of the approaches we've discussed have been implemented with the JUnit library. An implementation agnostic way of filtering test cases is by following a naming convention. For our example, we'll use UnitTest suffix for unit tests and IntegrationTest for integration tests.

Now we'll use the Maven Surefire Plugin for executing either the unit tests or the integrations tests:

 maven-surefire-plugin 2.20.1   **/*IntegrationTest.java   

The excludes tag here filters all integration tests and executes only the unit tests. Such a configuration would save a considerable amount of build time.

Furthermore, we can execute the Surefire plugin within various Maven profiles with different exclusions or inclusions.

Sebbene Surefire funzioni bene per il filtraggio, si consiglia di utilizzare il plug-in Failsafe per eseguire i test di integrazione in Maven.

5. conclusione

In questo articolo, abbiamo visto un modo per taggare e filtrare i casi di test con JUnit 5. Abbiamo usato l' annotazione Tag e abbiamo anche visto vari modi per filtrare i test JUnit con un tag specifico attraverso l'IDE o nel processo di compilazione usando Maven.

Abbiamo anche discusso alcuni dei meccanismi di filtraggio prima di JUnit 5.

Tutti gli esempi sono disponibili su Github.