En aquest tema, aprendrem a utilitzar l'anotació @ParameterizedTest de JUnit per crear tests parametritzats. Els tests parametritzats permeten executar el mateix test diverses vegades amb diferents conjunts de dades, la qual cosa és molt útil per verificar el comportament del codi amb diferents entrades.

Què és un Test Parametritzat?

Un test parametritzat és un test que s'executa múltiples vegades amb diferents valors d'entrada. Això permet verificar que el codi funcioni correctament per a una varietat de casos sense haver d'escriure múltiples tests individuals.

Configuració de @ParameterizedTest

Per utilitzar @ParameterizedTest, necessitem importar les següents classes:

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

Exemple Bàsic amb @ValueSource

L'anotació @ValueSource permet especificar un conjunt de valors literals que es passaran al test. A continuació, es mostra un exemple bàsic:

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

public class ParameterizedTestExample {

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

Explicació del Codi

  1. Importacions: Importem les classes necessàries per a @ParameterizedTest i @ValueSource.
  2. Definició del Test: Utilitzem l'anotació @ParameterizedTest per indicar que aquest és un test parametritzat.
  3. @ValueSource: Especifica un conjunt de valors literals (en aquest cas, enters) que es passaran al test.
  4. Mètode de Test: El mètode testWithValueSource s'executarà cinc vegades, una per cada valor especificat a @ValueSource.

Utilitzant @CsvSource

L'anotació @CsvSource permet passar múltiples arguments al test en format CSV (valors separats per comes). A continuació, es mostra un exemple:

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

public class CsvSourceExample {

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

Explicació del Codi

  1. Importacions: Importem les classes necessàries per a @ParameterizedTest i @CsvSource.
  2. Definició del Test: Utilitzem l'anotació @ParameterizedTest per indicar que aquest és un test parametritzat.
  3. @CsvSource: Especifica un conjunt de valors en format CSV. Cada línia representa un conjunt d'arguments que es passaran al test.
  4. Mètode de Test: El mètode testWithCsvSource s'executarà cinc vegades, una per cada conjunt de valors especificat a @CsvSource.

Utilitzant @MethodSource

L'anotació @MethodSource permet utilitzar un mètode que retorna un Stream, Iterable o Iterator de valors que es passaran al test. A continuació, es mostra un exemple:

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
import java.util.stream.Stream;
import static org.junit.jupiter.api.Assertions.assertTrue;

public class MethodSourceExample {

    @ParameterizedTest
    @MethodSource("stringProvider")
    void testWithMethodSource(String argument) {
        assertTrue(argument.length() > 0);
    }

    static Stream<String> stringProvider() {
        return Stream.of("apple", "banana", "cherry");
    }
}

Explicació del Codi

  1. Importacions: Importem les classes necessàries per a @ParameterizedTest i @MethodSource.
  2. Definició del Test: Utilitzem l'anotació @ParameterizedTest per indicar que aquest és un test parametritzat.
  3. @MethodSource: Especifica el nom del mètode que proporcionarà els valors per al test.
  4. Mètode de Test: El mètode testWithMethodSource s'executarà tres vegades, una per cada valor retornat pel mètode stringProvider.
  5. Mètode Proveïdor: El mètode stringProvider retorna un Stream de cadenes de text que es passaran al test.

Exercici Pràctic

Exercici

Crea un test parametritzat que verifiqui si una cadena de text és un palíndrom. Utilitza @CsvSource per proporcionar diferents cadenes de text i els seus resultats esperats (true o false).

Solució

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

public class PalindromeTest {

    @ParameterizedTest
    @CsvSource({
        "madam, true",
        "racecar, true",
        "hello, false",
        "level, true",
        "world, false"
    })
    void testIsPalindrome(String input, boolean expected) {
        assertEquals(expected, isPalindrome(input));
    }

    boolean isPalindrome(String str) {
        String reversed = new StringBuilder(str).reverse().toString();
        return str.equals(reversed);
    }
}

Explicació del Codi

  1. Definició del Test: Utilitzem l'anotació @ParameterizedTest per indicar que aquest és un test parametritzat.
  2. @CsvSource: Especifica un conjunt de cadenes de text i els seus resultats esperats.
  3. Mètode de Test: El mètode testIsPalindrome s'executarà cinc vegades, una per cada conjunt de valors especificat a @CsvSource.
  4. Mètode Auxiliar: El mètode isPalindrome verifica si una cadena de text és un palíndrom.

Conclusió

En aquest tema, hem après a utilitzar l'anotació @ParameterizedTest de JUnit per crear tests parametritzats. Hem vist exemples amb @ValueSource, @CsvSource i @MethodSource, i hem practicat amb un exercici per verificar si una cadena de text és un palíndrom. Els tests parametritzats són una eina poderosa per verificar el comportament del codi amb diferents conjunts de dades de manera eficient.

© Copyright 2024. Tots els drets reservats