¿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
- Importaciones: Importamos las clases necesarias para los tests parametrizados.
- Clase de Prueba: Definimos una clase
NumberTest
. - Método de Prueba: Definimos un método
testIsEven
anotado con@ParameterizedTest
. - Fuente de Valores: Usamos
@ValueSource
para proporcionar un array de enteros que se pasarán al método de prueba. - 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
- Importaciones: Importamos las clases necesarias.
- Clase de Prueba: Definimos una clase
StringTest
. - Método de Prueba: Definimos un método
testStringLength
anotado con@ParameterizedTest
. - Fuente de Valores: Usamos
@CsvSource
para proporcionar pares de valores (cadena y longitud esperada). - 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
- Importaciones: Importamos las clases necesarias.
- Clase de Prueba: Definimos una clase
PalindromeTest
. - Método de Prueba: Definimos un método
testIsPalindrome
anotado con@ParameterizedTest
. - Fuente de Valores: Usamos
@ValueSource
para proporcionar un array de cadenas que son palíndromos. - Método Auxiliar: Definimos un método
isPalindrome
que verifica si una cadena es un palíndromo. - 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.
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