Balisage et filtrage des tests JUnit

1. Vue d'ensemble

Il est très courant d'exécuter automatiquement tous nos tests JUnit dans le cadre de la construction de CI à l'aide de Maven. Ceci, cependant, prend souvent du temps.

Par conséquent, nous souhaitons souvent filtrer nos tests et exécuter des tests unitaires ou des tests d'intégration ou les deux à différentes étapes du processus de construction.

Dans ce didacticiel, nous examinerons quelques techniques de filtrage pour les cas de test avec JUnit 5. Dans les sections suivantes, nous examinerons également divers mécanismes de filtrage avant JUnit 5.

2. Balises JUnit 5

2.1. Annoter des tests JUnit avec une balise

Avec JUnit 5, nous pouvons filtrer les tests en marquant un sous-ensemble d'entre eux sous un nom de balise unique. Par exemple, supposons que nous ayons à la fois des tests unitaires et des tests d'intégration implémentés à l'aide de JUnit 5. Nous pouvons ajouter des balises sur les deux ensembles de cas de test:

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

Désormais, nous pouvons exécuter tous les tests sous un nom de balise particulier séparément . Nous pouvons également baliser la classe au lieu des méthodes. Incluant ainsi tous les tests d'une classe sous une balise.

Dans les prochaines sections, nous verrons différentes manières de filtrer et d'exécuter les tests JUnit balisés.

2.2. Filtrage des tags avec Test Suite

JUnit 5 nous permet d'implémenter des suites de tests à travers lesquelles nous pouvons exécuter des cas de test balisés:

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

Maintenant, si nous exécutons cette suite, tous les tests JUnit sous la balise UnitTest seraient exécutés . De même, nous pouvons exclure les tests avec l' annotation ExcludeTags .

2.3. Filtrage des tags avec le plug-in Maven Surefire

Pour filtrer les tests JUnit dans les différentes phases de la construction de Maven, nous pouvons utiliser le plugin Maven Surefire. Le plugin Surefire nous permet d'inclure ou d'exclure les balises dans la configuration du plugin :

 maven-surefire-plugin 2.20.1  UnitTest  

Si nous exécutons maintenant ce plugin, il exécutera tous les tests marqués comme UnitTest. De même, nous pouvons exclure les cas de test sous un nom de balise:

IntegrationTest

2.4. Filtrage des balises avec un IDE

Les IDE permettent désormais de filtrer les tests JUnit par balises. De cette façon, nous pouvons exécuter un ensemble spécifique de tests étiquetés directement à partir de notre IDE.

IntelliJ permet un tel filtrage via une configuration d'exécution / débogage personnalisée:

Comme le montre cette image, nous avons sélectionné le type de test en tant que balises et la balise à exécuter dans l'expression de balise.

JUnit 5 autorise diverses expressions de balises qui peuvent être utilisées pour filtrer les balises. Par exemple, pour exécuter tout sauf les tests d'intégration, nous pourrions utiliser ! IntegrationTest comme expression de balise. Ou pour exécuter à la fois UnitTest et IntegrationTest, nous pouvons utiliser UnitTest | Test d'intégration.

De même, Eclipse permet également d'inclure ou d'exclure des balises dans les configurations JUnit Run / Debug:

3. Catégories JUnit 4

3.1. Catégorisation des tests JUnit

JUnit 4 nous permet d'exécuter un sous-ensemble de tests JUnit en les ajoutant dans différentes catégories. En conséquence, nous pouvons exécuter les cas de test dans une catégorie particulière tout en excluant d'autres catégories.

Nous pouvons créer autant de catégories en implémentant des interfaces de marqueurs où le nom de l'interface de marqueur représente le nom de la catégorie. Pour notre exemple, nous allons implémenter deux catégories, UnitTest:

public interface UnitTest { }

et IntegrationTest:

public interface IntegrationTest { }

Maintenant, nous pouvons catégoriser notre JUnit en l'annotant avec l' annotation de catégorie :

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

Dans notre exemple, nous mettons l' annotation Category sur les méthodes de test. De même, nous pouvons également ajouter cette annotation sur la classe de test, ajoutant ainsi tous les tests dans une seule catégorie.

3.2. Catégories Runner

Afin d'exécuter des tests JUnit dans une catégorie, nous devons implémenter une classe de suite de tests:

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

Cette suite de tests peut être exécutée à partir d'un IDE et exécuterait tous les tests JUnit sous la catégorie UnitTest . De même, nous pouvons également exclure une catégorie de tests dans la suite:

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

3.3. Exclure ou inclure des catégories dans Maven

Enfin, nous pouvons également inclure ou exclure les catégories de tests JUnit de la version Maven. Ainsi, nous pouvons exécuter différentes catégories de tests JUnit dans différents profils Maven.

Nous utiliserons le plugin Maven Surefire pour cela:

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

Et de même, nous pouvons exclure une catégorie de la version Maven:

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

Ceci est similaire à l'exemple dont nous avons discuté dans la section précédente. La seule différence est que nous avons remplacé le nom de la balise par le nom complet de l' implémentation de la catégorie .

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.

Bien que Surefire fonctionne bien pour le filtrage, il est recommandé d'utiliser le plug-in Failsafe pour exécuter des tests d'intégration dans Maven.

5. Conclusion

Dans cet article, nous avons vu un moyen de baliser et de filtrer les cas de test avec JUnit 5. Nous avons utilisé l' annotation Tag et avons également vu différentes façons de filtrer les tests JUnit avec une balise spécifique via l'EDI ou dans le processus de construction à l'aide de Maven.

Nous avons également discuté de certains des mécanismes de filtrage avant JUnit 5.

Tous les exemples sont disponibles sur Github.