En este tema, aprenderemos cómo crear tests parametrizados en JUnit. Los tests parametrizados permiten ejecutar el mismo test varias veces con diferentes valores de entrada, lo que es útil para probar múltiples casos de una manera eficiente y organizada.

¿Qué son los Tests Parametrizados?

Los tests parametrizados en JUnit permiten ejecutar un método de prueba varias veces con diferentes conjuntos de datos. Esto es especialmente útil cuando se desea probar una función con múltiples entradas y verificar que produce los resultados esperados para cada una de ellas.

Configuración Inicial

Antes de comenzar a crear tests parametrizados, asegúrate de tener JUnit 5 configurado en tu proyecto. Si no lo has hecho, puedes seguir las instrucciones del módulo "Configurando JUnit".

Creando un Test Parametrizado

Paso 1: Importar las Anotaciones Necesarias

Para crear tests parametrizados, necesitas importar las siguientes anotaciones de JUnit 5:

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

Paso 2: Definir el Test Parametrizado

Vamos a crear un test simple que verifique si un número es par. Utilizaremos la anotación @ParameterizedTest junto con @ValueSource para proporcionar diferentes valores de entrada.

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

public class NumberTest {

    @ParameterizedTest
    @ValueSource(ints = {2, 4, 6, 8, 10})
    void testIsEven(int number) {
        assertTrue(number % 2 == 0, "Number should be even");
    }
}

Explicación del Código

  1. Anotación @ParameterizedTest: Indica que el método es un test parametrizado.
  2. Anotación @ValueSource: Proporciona un conjunto de valores de entrada. En este caso, estamos pasando un array de enteros {2, 4, 6, 8, 10}.
  3. Método testIsEven: Este método se ejecutará una vez por cada valor proporcionado en @ValueSource. Verifica que cada número es par utilizando assertTrue.

Ejemplo con Múltiples Tipos de Datos

Puedes usar diferentes proveedores de datos para tests parametrizados, como @ValueSource, @CsvSource, @CsvFileSource, y @MethodSource. Aquí hay un ejemplo utilizando @CsvSource para probar una función que convierte cadenas a mayúsculas:

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

public class StringTest {

    @ParameterizedTest
    @CsvSource({
        "hello, HELLO",
        "world, WORLD",
        "junit, JUNIT"
    })
    void testToUpperCase(String input, String expected) {
        assertEquals(expected, input.toUpperCase());
    }
}

Explicación del Código

  1. Anotación @CsvSource: Proporciona pares de valores separados por comas. Cada par se pasa como argumentos al método de prueba.
  2. Método testToUpperCase: Este método se ejecutará una vez por cada par de valores proporcionados en @CsvSource. Verifica que la conversión a mayúsculas es correcta utilizando assertEquals.

Ejercicio Práctico

Ejercicio

Crea un test parametrizado que verifique si una cadena es un palíndromo. Un palíndromo es una palabra que se lee igual de adelante hacia atrás y viceversa.

  1. Define un método isPalindrome que tome una cadena y devuelva true si es un palíndromo y false en caso contrario.
  2. Crea un test parametrizado utilizando @CsvSource para probar diferentes cadenas.

Solución

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

public class PalindromeTest {

    boolean isPalindrome(String str) {
        String cleaned = str.replaceAll("\\s+", "").toLowerCase();
        String reversed = new StringBuilder(cleaned).reverse().toString();
        return cleaned.equals(reversed);
    }

    @ParameterizedTest
    @CsvSource({
        "racecar, true",
        "hello, false",
        "madam, true",
        "step on no pets, true",
        "java, false"
    })
    void testIsPalindrome(String input, boolean expected) {
        if (expected) {
            assertTrue(isPalindrome(input));
        } else {
            assertFalse(isPalindrome(input));
        }
    }
}

Explicación del Código

  1. Método isPalindrome: Limpia la cadena de espacios y la convierte a minúsculas. Luego, compara la cadena original con su versión invertida.
  2. Anotación @CsvSource: Proporciona pares de valores (cadena y resultado esperado).
  3. Método testIsPalindrome: Verifica si la cadena es un palíndromo utilizando assertTrue o assertFalse según el resultado esperado.

Conclusión

En esta sección, hemos aprendido cómo crear tests parametrizados en JUnit utilizando diferentes proveedores de datos. Los tests parametrizados son una herramienta poderosa para probar múltiples casos de una manera eficiente y organizada. En el próximo tema, exploraremos cómo usar la anotación @ParameterizedTest con diferentes tipos de proveedores de datos para crear tests aún más flexibles y robustos.

© Copyright 2024. Todos los derechos reservados