Glosario · Automatización de UI
Aislamiento de tests
En inglés: Test isolation
También llamado: tests aislados, independencia de tests, aislamiento de pruebas, tests independientes
Definición
Propiedad por la que cada test prepara su propio estado y puede pasar por sí solo, en cualquier orden y en paralelo, sin depender de otros tests ni afectarlos.
Un test aislado crea todo lo que necesita, no depende de nada que haya dejado otro test y no deja nada que cambie el resultado de otro test. Si puedes ejecutar cualquier test por separado, ejecutar la suite completa en orden inverso o repartirla entre ocho workers en paralelo y obtener los mismos resultados, la suite está aislada. El aislamiento es lo que hace seguros la ejecución en paralelo y el sharding.
Ejemplo
No aislado: el segundo test depende del primero.
test('creates a project', async ({ page }) => {
await page.goto('/projects/new');
await page.getByLabel('Name').fill('Apollo');
await page.getByRole('button', { name: 'Create' }).click();
});
test('renames the project', async ({ page }) => {
await page.goto('/projects/apollo'); // fails if run alone or first
});
Aislado: cada test crea sus propios datos, con un nombre único, a través de la API.
test('renames a project', async ({ page, request }) => {
const name = `proj-${crypto.randomUUID()}`;
const res = await request.post('/api/projects', { data: { name } });
const { id } = await res.json();
await page.goto(`/projects/${id}`);
// ...rename and assert
});
Playwright ayuda a nivel de navegador: cada test recibe un BrowserContext nuevo, así que las cookies, el local storage y las sesiones nunca se filtran entre tests.
Fuentes de filtración
- Cuentas y registros compartidos que los tests modifican, como un único “usuario de prueba” cuya configuración cambian todos los tests.
- Estado estático o global en el código de test, como un driver singleton o una variable a nivel de clase.
- Filas de base de datos sin limpieza, o tests que comprueban el número de filas de una tabla en la que también escriben otros tests.
- Estado externo, como feature flags, bandejas de entrada de correo, la hora y las cachés.
Cómo comprobarlo
Ejecuta los tests en orden aleatorio. JUnit 5 admite @TestMethodOrder(MethodOrderer.Random.class), y se puede definir un orden aleatorio por defecto para todas las clases en junit-platform.properties. Ejecuta tests individuales por separado. Ejecuta la suite con más workers de lo habitual. Cualquier test cuyo resultado cambie no está aislado.
El aislamiento total tiene un coste, sobre todo cuando la preparación es lenta. Un compromiso habitual es compartir por worker los datos costosos y de solo lectura, y mantener único para cada test todo lo que ese test escribe.