¿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
testIsEvenanotado con@ParameterizedTest. - Fuente de Valores: Usamos
@ValueSourcepara 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
testStringLengthanotado con@ParameterizedTest. - Fuente de Valores: Usamos
@CsvSourcepara 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
testIsPalindromeanotado con@ParameterizedTest. - Fuente de Valores: Usamos
@ValueSourcepara proporcionar un array de cadenas que son palíndromos. - Método Auxiliar: Definimos un método
isPalindromeque 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
