Els tests parametritzats són una característica poderosa de JUnit que permet executar el mateix test diverses vegades amb diferents dades d'entrada. Això és especialment útil quan es vol provar una funció amb múltiples conjunts de dades sense haver de duplicar el codi del test.

Conceptes Clau

  1. Reutilització del Codi de Test: Els tests parametritzats permeten reutilitzar el mateix codi de test per a diferents conjunts de dades, reduint la duplicació i millorant la mantenibilitat.
  2. Cobertura de Casos de Test: Amb els tests parametritzats, es poden cobrir més casos de test amb menys codi, assegurant que la funció es comporti correctament amb una varietat de dades d'entrada.
  3. Estructura del Test: Els tests parametritzats en JUnit es defineixen utilitzant l'anotació @ParameterizedTest i una font de dades, com ara @ValueSource, @CsvSource, @MethodSource, etc.

Exemples Pràctics

Exemple 1: Utilitzant @ValueSource

L'anotació @ValueSource permet passar un conjunt de valors literals al test.

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import static org.junit.jupiter.api.Assertions.assertTrue;

public class ValueSourceTest {

    @ParameterizedTest
    @ValueSource(ints = {1, 2, 3, 4, 5})
    void testWithValueSource(int argument) {
        assertTrue(argument > 0 && argument < 6);
    }
}

Explicació:

  • @ParameterizedTest: Indica que aquest és un test parametritzat.
  • @ValueSource(ints = {1, 2, 3, 4, 5}): Proporciona un conjunt de valors literals (en aquest cas, enters) que es passaran al test.
  • testWithValueSource(int argument): El test es cridarà una vegada per a cada valor proporcionat per @ValueSource.

Exemple 2: Utilitzant @CsvSource

L'anotació @CsvSource permet passar múltiples valors en format CSV (Comma-Separated Values).

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import static org.junit.jupiter.api.Assertions.assertEquals;

public class CsvSourceTest {

    @ParameterizedTest
    @CsvSource({
        "1, 1",
        "2, 4",
        "3, 9",
        "4, 16",
        "5, 25"
    })
    void testWithCsvSource(int input, int expected) {
        assertEquals(expected, input * input);
    }
}

Explicació:

  • @CsvSource: Proporciona un conjunt de valors en format CSV.
  • testWithCsvSource(int input, int expected): El test es cridarà una vegada per a cada conjunt de valors proporcionat per @CsvSource.

Exercici Pràctic

Exercici 1: Test de Funció de Factorial

Escriu un test parametritzat per a una funció que calcula el factorial d'un nombre.

Funció a Provar:

public class MathUtils {
    public static int factorial(int n) {
        if (n < 0) throw new IllegalArgumentException("Number must be non-negative");
        int result = 1;
        for (int i = 1; i <= n; i++) {
            result *= i;
        }
        return result;
    }
}

Test Parametritzat:

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import static org.junit.jupiter.api.Assertions.assertEquals;

public class MathUtilsTest {

    @ParameterizedTest
    @CsvSource({
        "0, 1",
        "1, 1",
        "2, 2",
        "3, 6",
        "4, 24",
        "5, 120"
    })
    void testFactorial(int input, int expected) {
        assertEquals(expected, MathUtils.factorial(input));
    }
}

Solució:

  • @CsvSource: Proporciona els valors d'entrada i els resultats esperats per a la funció de factorial.
  • testFactorial(int input, int expected): El test comprova que la funció factorial retorna el valor esperat per a cada entrada.

Conclusió

Els tests parametritzats són una eina essencial per a qualsevol desenvolupador que vulgui assegurar-se que el seu codi funcioni correctament amb una varietat de dades d'entrada. Utilitzant anotacions com @ValueSource i @CsvSource, es poden escriure tests més eficients i mantenibles. En el proper tema, explorarem com crear tests parametritzats més complexos utilitzant altres fonts de dades.

© Copyright 2024. Tots els drets reservats