Respuesta
Primero confirmo y mido: corro el test muchas veces (en local y en CI) y reviso el historial para calcular su tasa de fallo. Junto evidencia: trazas, screenshots, video, logs del backend y el orden de ejecución.
Causas típicas y cómo las ataco
- Esperas fijas o condiciones de carrera: reemplazo los sleep por esperas sobre condiciones observables.
- Dependencia entre tests o datos compartidos: cada test crea sus propios datos (por API o seed) con identificadores únicos y los limpia al final. Corro la suite en orden aleatorio para detectar acoplamientos.
- Selectores frágiles: uso data-testid o roles accesibles en vez de XPath largos.
- Entorno inestable: servicios externos lentos. Uso mocks o stubs donde no aportan valor E2E y reviso recursos del runner.
- Tiempo y zona horaria: fijo el reloj o la zona horaria en los tests que dependen de fechas.
Ejemplo con Playwright:
// Mal: espera fija
await page.waitForTimeout(3000);
// Bien: espera a una condición real
await expect(page.getByRole('status')).toHaveText('Pedido confirmado');Gestión: si no se puede arreglar enseguida, pongo el test en cuarentena (etiquetado y fuera del gate de merge, pero ejecutándose igual), con un ticket y un responsable. Los reintentos automáticos sirven como paliativo temporal, pero solo si se registran: un test que pasa al segundo intento sigue siendo flaky. También reviso si el flaky esconde un bug real de concurrencia en la aplicación.
Errores comunes
Proponer solo subir los timeouts o activar reintentos y dar el tema por cerrado. Tampoco hay que borrar el test sin analizarlo ni asumir que siempre es culpa del test y nunca un bug real de la app.
Redactado con el asistente Underc0de IA. Actualizado el 09/11/2026. ¿Ves un error? Contanos en el foro.