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) {
}