¿Qué son los Tests Parametrizados?

Los tests parametrizados en JUnit permiten ejecutar el mismo test varias veces con diferentes valores de entrada. Esto es útil para verificar que una función o método se comporte correctamente con una variedad de datos sin tener que escribir múltiples métodos de prueba.

Ventajas de los Tests Parametrizados

  • Reutilización del Código de Prueba: Evita la duplicación de código al permitir que un solo método de prueba se ejecute con diferentes conjuntos de datos.
  • Cobertura de Pruebas: Aumenta la cobertura de pruebas al verificar el comportamiento del código con múltiples entradas.
  • Mantenimiento: Facilita el mantenimiento de los tests, ya que cualquier cambio en el método de prueba se aplica a todas las entradas de datos.

Configuración Básica

Para utilizar tests parametrizados en JUnit, necesitas importar las siguientes clases:

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

Ejemplo Básico

A continuación, se muestra un ejemplo básico de un test parametrizado que verifica si un número es par:

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);
    }
}

Explicación del Código

  1. Importaciones: Importamos las clases necesarias para los tests parametrizados.
  2. Clase de Prueba: Definimos una clase NumberTest.
  3. Método de Prueba: Definimos un método testIsEven anotado con @ParameterizedTest.
  4. Fuente de Valores: Usamos @ValueSource para proporcionar un array de enteros que se pasarán al método de prueba.
  5. Aserción: Verificamos que cada número proporcionado es par usando assertTrue.

Tipos de Fuentes de Datos

JUnit proporciona varias anotaciones para diferentes tipos de fuentes de datos:

Anotación Descripción
@ValueSource Proporciona un array de valores literales (int, long, double, String, etc.)
@EnumSource Proporciona valores de un tipo enumerado
@MethodSource Proporciona valores desde un método estático
@CsvSource Proporciona valores desde una lista de cadenas CSV
@CsvFileSource Proporciona valores desde un archivo CSV

Ejemplo con @CsvSource

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, 5",
        "JUnit, 4",
        "parameterized, 13"
    })
    void testStringLength(String input, int expectedLength) {
        assertEquals(expectedLength, input.length());
    }
}

Explicación del Código

  1. Importaciones: Importamos las clases necesarias.
  2. Clase de Prueba: Definimos una clase StringTest.
  3. Método de Prueba: Definimos un método testStringLength anotado con @ParameterizedTest.
  4. Fuente de Valores: Usamos @CsvSource para proporcionar pares de valores (cadena y longitud esperada).
  5. Aserción: Verificamos que la longitud de cada cadena proporcionada coincide con la longitud esperada usando assertEquals.

Ejercicio Práctico

Ejercicio

Escribe 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.

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

public class PalindromeTest {

    @ParameterizedTest
    @ValueSource(strings = {"radar", "level", "rotor", "civic", "madam"})
    void testIsPalindrome(String word) {
        assertTrue(isPalindrome(word));
    }

    boolean isPalindrome(String word) {
        int n = word.length();
        for (int i = 0; i < n / 2; i++) {
            if (word.charAt(i) != word.charAt(n - i - 1)) {
                return false;
            }
        }
        return true;
    }
}

Solución

  1. Importaciones: Importamos las clases necesarias.
  2. Clase de Prueba: Definimos una clase PalindromeTest.
  3. Método de Prueba: Definimos un método testIsPalindrome anotado con @ParameterizedTest.
  4. Fuente de Valores: Usamos @ValueSource para proporcionar un array de cadenas que son palíndromos.
  5. Método Auxiliar: Definimos un método isPalindrome que verifica si una cadena es un palíndromo.
  6. Aserción: Verificamos que cada cadena proporcionada es un palíndromo usando assertTrue.

Conclusión

En esta lección, hemos aprendido qué son los tests parametrizados y cómo utilizarlos en JUnit. Hemos visto ejemplos prácticos y hemos explorado diferentes tipos de fuentes de datos que se pueden usar para parametrizar tests. Los tests parametrizados son una herramienta poderosa para mejorar la cobertura de pruebas y mantener el código de prueba limpio y reutilizable.

En la próxima lección, profundizaremos en cómo crear tests parametrizados más complejos y personalizados.

© Copyright 2024. Todos los derechos reservados