5 cosas que hacen tus tests de Playwright flaky (y cómo arreglarlas sin poner sleep)
Lo que aprendí con 900 tests nocturnos y un martes maldito
Contents
Qué onda raza. Después del post del martes maldito (el test que solo fallaba los martes, búsquenlo) varios me preguntaron por DM cómo le hacemos para mantener 900 tests e2e sin volvernos locos. Aquí va lo que neta nos funcionó. Nada de magia, pura chamba.
1. Deja de usar waitForTimeout
Si tienes await page.waitForTimeout(3000), ya perdiste. En tu máquina 3 segundos sobran, en CI con 2 CPUs no alcanzan. Usa las aserciones que reintentan solas:
// mal
await page.click('#guardar')
await page.waitForTimeout(3000)
expect(await page.textContent('.toast')).toBe('Guardado')
// bien
await page.getByRole('button', { name: 'Guardar' }).click()
await expect(page.getByText('Guardado')).toBeVisible()
await expect(locator).toBeVisible() reintenta hasta el timeout. expect(await ...) no reintenta nada: evalúa una vez y ya.
2. Locators por rol, no por clase CSS
La clase .btn-primary-v2-final la cambia el de frontend el viernes sin avisar. El rol y el texto que ve el usuario cambian mucho menos. getByRole, getByLabel, getByText, y getByTestId cuando no hay de otra.
3. Cada test crea sus propios datos
Nada de cuentas compartidas (ya saben por qué 🤣). Usamos fixtures que crean el usuario por API y lo borran al final:
import { test as base } from '@playwright/test'
export const test = base.extend({
usuario: async ({ request }, use, testInfo) => {
const email = 'qa-' + testInfo.workerIndex + '-' + Date.now() + '@example.test'
const res = await request.post('/api/test/users', { data: { email } })
const usuario = await res.json()
await use(usuario)
await request.delete('/api/test/users/' + usuario.id)
},
})
4. Controla el tiempo y la zona horaria
En playwright.config.ts fija timezoneId y locale. Y si el test depende de la fecha, congélala con page.clock.setFixedTime(). El reloj real es el enemigo.
5. Retries solo en CI, y que duelan
// playwright.config.ts
retries: process.env.CI ? 2 : 0,
use: {
trace: 'on-first-retry',
},
Y aquí lo importante: un test que pasó en el segundo intento no pasó. Playwright ya te lo marca como flaky en el reporte, y alguien lo tiene que revisar esa misma semana. Si no, los retries nada más esconden la basura debajo del tapete.
Bonus: la cuarentena con dueño
Si un test entra a cuarentena, lleva nombre del responsable y fecha de vencimiento. Si pasan dos semanas, se discute en la daily. Desde que hicimos eso bajamos de 31 tests en cuarentena a 4.
Y ya. Si tienen dudas pregunten aquí, ahorita les contesto (y esta vez sí es ahorita, no el ahorita mexicano 🤣).
Written by
Luis Treviño
QA Automation en Monterrey 🇲🇽 Cypress, Playwright y romper cosas por chamba. Si no lo probaste, no funciona, wey.
Get the best of #flaky_test_society weekly
One email each Monday with the most useful posts. No spam; unsubscribe in one click.
Comments
Sign in to join the conversation.
Sign in to comment