Glosario · Automatización de UI
Pruebas basadas en datos (data-driven testing)
En inglés: Data-driven testing
También llamado: pruebas dirigidas por datos, pruebas parametrizadas, tests parametrizados, DDT
Definición
Ejecutar la misma lógica de prueba con muchos conjuntos de entradas y resultados esperados, guardados en una tabla, archivo o fuente de datos y no copiados en cada test.
Las pruebas basadas en datos separan lo que hace una prueba de los datos con los que lo hace. Escribes los pasos una sola vez y luego le das filas de datos: las entradas y el resultado que debe producir cada una. Cada fila se ejecuta como un caso de prueba independiente, con su propio resultado de pasa o falla. Es la forma natural de automatizar el resultado de técnicas como el análisis de valores límite y la partición de equivalencia.
Ejemplo (JUnit 5)
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import static org.junit.jupiter.api.Assertions.assertEquals;
class ShippingFeeTest {
@ParameterizedTest(name = "order of {0} costs {1} to ship")
@CsvSource({
"0.00, 4.99",
"49.99, 4.99",
"50.00, 0.00",
"250.00, 0.00"
})
void shippingFee(double orderTotal, double expectedFee) {
assertEquals(expectedFee, Shipping.feeFor(orderTotal), 0.001);
}
}
Esto necesita el artefacto junit-jupiter-params. Otras fuentes de datos son @ValueSource, @MethodSource y @CsvFileSource, para datos guardados en un archivo CSV.
Ejemplo (Playwright)
Playwright no tiene una anotación especial; generas los tests en un bucle y das a cada uno un título único:
import { test, expect } from '@playwright/test';
const cases = [
{ email: '', error: 'Email is required' },
{ email: 'not-an-email', error: 'Enter a valid email' },
];
for (const { email, error } of cases) {
test(`login rejects "${email}"`, async ({ page }) => {
await page.goto('/login');
await page.getByLabel('Email').fill(email);
await page.getByRole('button', { name: 'Sign in' }).click();
await expect(page.getByRole('alert')).toHaveText(error);
});
}
Errores comunes
- Filas que necesitan pasos distintos. Si la mitad de las filas necesita un clic extra, tienes dos tests, no uno lleno de condicionales.
- Nombres ilegibles. Incluye las entradas clave en el nombre de cada caso para que el informe de fallos diga qué fila se rompió.
- Hojas de cálculo externas enormes. Los datos lejos del test son difíciles de revisar. Mantén las tablas pequeñas en el propio código; pásalas a archivos solo cuando los datos sean realmente grandes o pertenezcan a otra persona.
- Volumen en vez de valor. Cincuenta filas de la misma clase de equivalencia añaden tiempo de ejecución, no cobertura.