Saltar al contenido principal
causProsolutions

Lección 4 de 7 · 10 min

Datos de prueba y aislamiento

Al terminar sabrás

10 min
  • Diagnosticar fallos aleatorios causados por datos compartidos
  • Generar datos únicos por test con factories y sembrarlos por API
  • Diseñar tests idempotientes que corren en cualquier orden y en paralelo

Construyes: El diseño de datos de una suite que paraleliza sin fallos aleatorios.

El culpable número uno de los fallos aleatorios

Tu suite pasa perfecto en tu máquina, en serie. La subes a CI con 4 workers y empieza a fallar al azar: a veces el test 12, a veces el 30, nunca el mismo. No es la herramienta ni la red: casi siempre son datos compartidos.

Dos tests que usan el mismo usuario, el mismo registro o reservan la misma hora funcionan bien mientras corran uno después de otro. En paralelo se pisan.

Factories: datos únicos por test

La cura es que cada test cree lo suyo. Una factory genera datos frescos y únicos:

import { randomUUID } from 'crypto';

export function makeCliente(overrides = {}) {
  const id = randomUUID().slice(0, 8);
  return {
    nombre: `Test ${id}`,
    email: `test-${id}@ejemplo.cl`,   // único: nunca choca
    telefono: '+56 9 1234 5678',
    ...overrides,                      // el test pide solo lo que le importa
  };
}

Dos cosas que la hacen buena:

  • Unicidad por defecto (el uuid): dos tests nunca generan el mismo email.
  • Overrides explícitos: el test declara solo el campo que le interesa (makeCliente({ nombre: 'Ana' })); el resto es ruido válido generado. Así el test comunica su intención.

Siembra por API, verifica por UI

Crear el usuario llenando el formulario de registro en cada test es lento y frágil: tu test de checkout falla porque cambió el registro, algo que ni siquiera estaba probando.

// ✅ El setup pesado, por API (rápido y estable)
const cliente = await api.crearCliente(makeCliente());

// ✅ La UI, solo para lo que el test verifica de verdad
await reservas.comoCliente(cliente).reservar('Corte', horaLibre);

Regla: prepara por API, verifica por UI. La UI se usa donde aporta valor de prueba, no como herramienta de setup.

Idempotencia y limpieza

Un test idempotente puede correrse 1 o 100 veces con el mismo resultado. Si el segundo intento falla con "el email ya existe", tu test no es idempotente y va a fallar en cada re-ejecución de CI.

Dos estrategias, ambas válidas:

  • Crear único y limpiar (fixture con teardown). Lo más limpio.
  • Crear único y no limpiar, en un entorno desechable que se recrea. Más simple si tienes esa infraestructura.

Lo que no funciona: reutilizar datos fijos y "esperar" que estén como los dejaste.

La regla de oro

Un test debe poder correr solo, en cualquier orden, cuantas veces quieras y al mismo tiempo que los demás.

Si cumple eso, paralelizas sin miedo y los reintentos funcionan. Si no lo cumple, ninguna herramienta ni reintento te va a salvar: solo van a esconder el problema hasta que explote en el peor momento.

Comprueba el criterio en el quiz y rediseña los datos en el reto.

Compruébalo

0/3

Responde sin mirar atrás. Verás la explicación al instante.

  1. 1. Tu suite pasa en serie pero falla aleatoriamente con 4 workers. ¿Primer sospechoso?

  2. 2. ¿Por qué sembrar los datos por API en vez de crearlos por la UI?

  3. 3. ¿Qué significa que un test sea idempotente?

Reto: aísla los datos

Un test de reservas usa siempre el cliente 'ana@test.cl' y reserva siempre el 20-07 a las 15:30. Falla al azar cuando corre en paralelo.

Explica por qué y rediséñalo.

Recursos de esta lección