Chapitre Les fonctionnalités avancées de JUnit
Création de tests paramétrés avec JUnit
Cette leçon présente comment créer des tests dynamiques basés sur un ensemble de valeurs.
Dernière modification : Dec 08 , 2024
Création de tests paramétrés
Les tests paramétrés permettent d'exécuter un test avec différents arguments.
Les tests sont déclarés comme des méthodes de tests classiques mais il faut utiliser l'annotation @ParameterizedTest
Les tests paramétrés consomment une source de données :
| Source de données | Utilisation |
|---|---|
| @ValueSource | tester avec un tableau de valeurs (typées) |
| @NullSource | tester avec la valeur nulle |
| @EmptySource | tester avec une valeur vide |
| @NullAndEmptySource | tester avec les valeurs nulle et vide |
| @EnumSource | tester avec des constants d'une énumération |
| @MethodSource | tester avec les valeurs retournées par une méthode |
| @CsvSource | tester avec une chaine de type CSV |
| @CsvFileSource | tester avec un fichier CSV |
Il est possible d'aggréger les valeurs utilisées pour produire un unique objet Java.
Avant
@ParameterizedTest
@CsvSource({
"Jane, Doe, F, 1990-05-20",
"John, Doe, M, 1990-10-22"
})
void testWithArgumentsAccessor(ArgumentsAccessor arguments) {
Person person = new Person(arguments.getString(0),
arguments.getString(1),
arguments.get(2, Gender.class),
arguments.get(3, LocalDate.class));
// Test
}
Après
@ParameterizedTest
@CsvSource({
"Jane, Doe, F, 1990-05-20",
"John, Doe, M, 1990-10-22"
})
void testWithArgumentsAggregator(@AggregateWith(PersonAggregator.class) Person person) {
// perform assertions against person
}
Il est possible de créer des annotations custom
@ParameterizedTest
@CsvSource({
"Jane, Doe, F, 1990-05-20",
"John, Doe, M, 1990-10-22"
})
void testWithCustomAggregatorAnnotation(@CsvToPerson Person person) {
// perform assertions against person
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
@AggregateWith(PersonAggregator.class)
public @interface CsvToPerson {
}
Il est possible de personnaliser le nom des tests
@DisplayName("Display name of container")
@ParameterizedTest(name = "{index} ==> the rank of ''{0}'' is {1}")
@CsvSource({ "apple, 1", "banana, 2", "'lemon, lime', 3" })
void testWithCustomDisplayNames(String fruit, int rank) {
}