Tests paramétrés

Introduction aux tests en Java

Maria Milusheva

Senior Software Engineer

Exemple : validation du nom d'utilisateur

Rappelez-vous l'exercice de validation du nom d'utilisateur du chapitre 1 :

public static boolean isValidUsername(String username) {
    if (username == null || username.isEmpty() || username.contains(" ")) {
        return false;
    }
    return username.length() >= 3;
}
Introduction aux tests en Java

Exemple : test de validation répétitif

Souvenez-vous, les tests ressemblaient à ceci :

@Test
void isValidUsername_returnsFalse() {
    String username = "____";

    boolean actual = isValidUsername(username);

    assertFalse(actual);
}

Inutile d'écrire 3 tests comme celui-ci !

1 https://en.wikipedia.org/wiki/Don%27t_repeat_yourself
Introduction aux tests en Java

Tests paramétrés : syntaxe

Au lieu de @Test, utilisez @ParameterizedTest.

Elle est importée depuis :

import org.junit.jupiter.params.ParameterizedTest;

Il faut aussi une autre annotation : @ValueSource.

Elle est importée depuis :

import org.junit.jupiter.params.provider.ValueSource;
Introduction aux tests en Java

Tests paramétrés : exemple de test

@ParameterizedTest
@ValueSource(strings = {"", "jane doe"}) // NOTE : c'est "strings", pas String
void isValidUsername_returnsFalse(String username) { // Les tests peuvent prendre des arguments
    boolean actual = isValidUsername(username);

    assertFalse(actual);
}

JUnit exécute ceci comme deux tests :

Tests run: 2, Failures: 0, Errors: 0, Skipped: 0
All tests passed!
Introduction aux tests en Java

Limites de @ValueSource

@ValueSource est limité à certains types.

@ValueSource(bytes = {1, 2, 3, 42})
@ValueSource(shorts = {100, 200, 300})
@ValueSource(ints = {1, 2, 3, 42})
@ValueSource(longs = {1000L, 2000L, 3000L})
@ValueSource(floats = {1.0f, 3.14159f, 2.71828f})
@ValueSource(doubles = {3.14, 2.71828, 1.4142})
@ValueSource(chars = {'a', 'b', 'c', 'Z'})
@ValueSource(booleans = {true, false})
@ValueSource(strings = {"Hello", "JUnit", "5", "Parameter"})
@ValueSource(classes = {String.class, Integer.class, ValueSourceExamples.class})
1 https://junit.org/junit5/docs/5.7.1/api/org.junit.jupiter.params/org/junit/jupiter/params/provider/ValueSource.html
Introduction aux tests en Java

@NullSource

On ne peut pas passer null à @ValueSource : la compilation échoue.

@ParameterizedTest
@ValueSource(strings = {"", "jane doe", null}) // Ne compile pas
void isValidUsername_returnsFalse(String username) {
    boolean actual = isValidUsername(username);

    assertFalse(actual);
}

Utilisez plutôt @NullSource.

Introduction aux tests en Java

Exécuter tout le ParameterizedTest

Si vous passez null à @ValueSource, la compilation échoue.

@ParameterizedTest
@NullSource // Ajoute un cas de test avec null
@ValueSource(strings = {"", "jane doe"})
void isValidUsername_returnsFalse(String username) {
    boolean actual = isValidUsername(username);

    assertFalse(actual);
}
Tests run: 3, Failures: 0, Errors: 0, Skipped: 0
All tests passed!
Introduction aux tests en Java

Plusieurs arguments par test

Autre limite de @ValueSource : un seul argument par test.

Considérez la méthode suivante :

int countLetters(String input) {
    if (input != null) {
        return input.length();
    }
    return 0;
}
Introduction aux tests en Java

@CsvSource

Pour plusieurs valeurs, utilisez @CsvSource (CSV = valeurs séparées par des virgules) :

@ParameterizedTest
@CsvSource({"Hello World, 11", "DataCamp, 8", "'', 0", ", 0"})
void countLetters_countsLetters(String input, int expected) {
    int actual = countLetters(input);

    assertEquals(expected, actual);
}

Notez que ", 0" fournit null, 0. Pour une chaîne vide, utilisez "'', 0" dans JUnit 5.10

@CsvSource has similar type limitations as @ValueSource.

Introduction aux tests en Java

Remarque : importer l'annotation Source

Toutes les annotations @____Source peuvent être importées depuis :

import org.junit.jupiter.params.provider.*;
Introduction aux tests en Java

Passons à la pratique !

Introduction aux tests en Java

Preparing Video For Download...