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
- Anotación
@ParameterizedTest
: Indica que el método es un test parametrizado. - Anotación
@ValueSource
: Proporciona un conjunto de valores de entrada. En este caso, estamos pasando un array de enteros{2, 4, 6, 8, 10}
. - Método
testIsEven
: Este método se ejecutará una vez por cada valor proporcionado en@ValueSource
. Verifica que cada número es par utilizandoassertTrue
.
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
- Anotación
@CsvSource
: Proporciona pares de valores separados por comas. Cada par se pasa como argumentos al método de prueba. - 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 utilizandoassertEquals
.
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.
- Define un método
isPalindrome
que tome una cadena y devuelvatrue
si es un palíndromo yfalse
en caso contrario. - 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
- Método
isPalindrome
: Limpia la cadena de espacios y la convierte a minúsculas. Luego, compara la cadena original con su versión invertida. - Anotación
@CsvSource
: Proporciona pares de valores (cadena y resultado esperado). - Método
testIsPalindrome
: Verifica si la cadena es un palíndromo utilizandoassertTrue
oassertFalse
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.
Curso de JUnit
Módulo 1: Introducción a JUnit
Módulo 2: Anotaciones Básicas de JUnit
- Entendiendo @Test
- Usando @Before y @After
- Usando @BeforeClass y @AfterClass
- Ignorando Tests con @Ignore
Módulo 3: Aserciones en JUnit
Módulo 4: Tests Parametrizados
- Introducción a los Tests Parametrizados
- Creando Tests Parametrizados
- Usando @ParameterizedTest
- Tests Parametrizados Personalizados
Módulo 5: Suites de Tests
Módulo 6: Mocking con JUnit
Módulo 7: Características Avanzadas de JUnit
Módulo 8: Mejores Prácticas y Consejos
- Escribiendo Tests Efectivos
- Organizando el Código de Tests
- Desarrollo Guiado por Tests (TDD)
- Integración Continua con JUnit