Salta el contingut
 

Proves parametritzades

Autor: Joan Puigcerver Ibáñez

Correu electrònic: j.puigcerveribanez@edu.gva.es

Llicència: CC BY-NC-SA 4.0

(Reconeixement - NoComercial - CompartirIgual) 🅭

Proves parametritzades

Les proves parametritzats són una proves que s'executen múltiples vegades amb diferents dades d'entrada (paràmetres).

Aquestes proves són útils quan vols provar diferents casos de prova que tenen la mateixa estructura.

Els tests parametritzats formen part de l'extensió junit-params, que ve inclosa en JUnit 5.

Origen de les dades

Per poder utilitzar tests parametritzats, cal indicar d'on s'obtindran les dades. Les dades poden ser obtingudes de diferents maneres, utilitzant diferents anotacions Source.

@ValueSource

@ValueSource és la manera més bàsica per passar-li dades a un test parametritzat.

S'utilitza per passar un únic argument a cada test. Els valors poden ser dades primitives o qualsevol tipus que es puga convertir a un Object.

@ParameterizedTest(name="{0} is even")
@ValueSource(ints = {2, 4, 6, 8, 10})
@DisplayName("Parameterized Test with ValueSource")
public void parameterizedValueSourceTest(int number) {
    assertEquals(0, number % 2);
}

@NullSource i @EmptySource

@NullSource s'utilitza per passar el valor null.

@EmptySource s'utilitza per passar el valor que es considera buit en el tipus de dades especificat.

Pot ser utilitzat en la classes:

  • String
  • List
  • Set
  • Map
  • Arrays de tipus primitius o objectes (int[], String[])
@ParameterizedTest(name="\"{0}\"")
@NullSource
@EmptySource
@ValueSource(strings = { " ", "      ", "  \n   " })
void nullEmptyAndBlankStrings(String text) {
    assertTrue(text == null || text.trim().isEmpty());
}

@CsvSource

@CsvSource s'utilitza per passar multiples arguments a un test parametritzat, separats per comes.

Els valors, sols poden ser tipus primitius (int, double, ...) o String.

Aquesta opció és molt útil per poder passar múltiples arguments a un test parametritzat de manera senzilla.

@ParameterizedTest(name="{0} + {1} should be {2}")
@CsvSource({ "1,1,2", "2,2,4", "3,3,6", "4,4,8", "5,5,10", "6,6,12", "7,7,14", "10,90,100" })
@DisplayName("Parameterized Test with CsvSource")
public void parameterizedCsvSourceTest(int left, int right, int expected) {
    assertEquals(expected, Math.addExact(left, right));
}

@MehodSource

@CsvSource s'utilitza per passar multiples arguments a un test parametritzat, obtinguts a partir d'un mètode estàtic.

Aquesta opció és molt versàtil, ja que permet passar multiples arguments de qualsevol tipus (objectes inclosos).

El mètode proveïdor de dades ha de retornar un Stream<Arguments> o qualsevol classe que puga convertir-se a aquest tipus, com Collection o List.

@ParameterizedTest(name="[{index}] {0} + {1} = {2}")
@MethodSource("numberToSum")
@DisplayName("Parameterized Test with MehodSource")
public void parameterizedMehodSourceTest(int left, int right, int expected) {
    assertEquals(expected, Math.addExact(left, right));
}

private static List<Arguments> numberToSum() {
    ArrayList<Arguments> args = new ArrayList<>();
    args.add(arguments(1, 1, 2));
    args.add(arguments(2, 2, 4));
    args.add(arguments(3, 3, 6));
    return args;
}

Comentaris