Meilleures pratiques JUnit 5+
Votre objectif est de m'aider à écrire des tests unitaires efficaces avec JUnit 5, couvrant à la fois les approches de test standard et data-driven.
Configuration du projet
- Utilisez une structure de projet Maven ou Gradle standard.
- Placez le code source des tests dans
src/test/java. - Incluez les dépendances pour
junit-jupiter-api,junit-jupiter-engineetjunit-jupiter-paramspour les tests paramétrés. - Utilisez les commandes de l'outil de build pour exécuter les tests :
mvn testougradle test.
Structure des tests
- Les classes de test doivent avoir un suffixe
Test, par exempleCalculatorTestpour une classeCalculator. - Utilisez
@Testpour les méthodes de test. - Suivez le modèle Arrange-Act-Assert (AAA).
- Nommez les tests en utilisant une convention descriptive, comme
methodName_should_expectedBehavior_when_scenario. - Utilisez
@BeforeEachet@AfterEachpour la configuration et le nettoyage par test. - Utilisez
@BeforeAllet@AfterAllpour la configuration et le nettoyage par classe (doivent être des méthodes statiques). - Utilisez
@DisplayNamepour fournir un nom lisible pour les classes et méthodes de test.
Tests standard
- Gardez les tests concentrés sur un seul comportement.
- Évitez de tester plusieurs conditions dans une seule méthode de test.
- Rendez les tests indépendants et idempotents (peuvent s'exécuter dans n'importe quel ordre).
- Évitez les interdépendances entre tests.
Tests data-driven (paramétrés)
- Utilisez
@ParameterizedTestpour marquer une méthode comme test paramétré. - Utilisez
@ValueSourcepour des valeurs littérales simples (chaînes, entiers, etc.). - Utilisez
@MethodSourcepour faire référence à une méthode factory qui fournit les arguments de test sous forme deStream,Collection, etc. - Utilisez
@CsvSourcepour des valeurs séparées par des virgules en ligne. - Utilisez
@CsvFileSourcepour utiliser un fichier CSV du classpath. - Utilisez
@EnumSourcepour utiliser des constantes enum.
Assertions
- Utilisez les méthodes statiques de
org.junit.jupiter.api.Assertions(par exempleassertEquals,assertTrue,assertNotNull). - Pour des assertions plus fluides et lisibles, envisagez d'utiliser une bibliothèque comme AssertJ (
assertThat(...).is...). - Utilisez
assertThrowsouassertDoesNotThrowpour tester les exceptions. - Groupez les assertions connexes avec
assertAllpour vous assurer que toutes les assertions sont vérifiées avant l'échec du test. - Utilisez des messages descriptifs dans les assertions pour clarifier l'échec.
Mocking et isolation
- Utilisez un framework de mocking comme Mockito pour créer des objets mock des dépendances.
- Utilisez les annotations
@Mocket@InjectMocksde Mockito pour simplifier la création et l'injection de mocks. - Utilisez des interfaces pour faciliter le mocking.
Organisation des tests
- Groupez les tests par fonctionnalité ou composant en utilisant des packages.
- Utilisez
@Tagpour catégoriser les tests (par exemple@Tag("fast"),@Tag("integration")). - Utilisez
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)et@Orderpour contrôler l'ordre d'exécution des tests si nécessaire. - Utilisez
@Disabledpour ignorer temporairement une méthode ou une classe de test, en fournissant une raison. - Utilisez
@Nestedpour grouper les tests dans une classe interne imbriquée pour une meilleure organisation et structure.