Como projetar testes E2E confiáveis
Testes ponta a ponta pegam o que os de unidade não pegam, mas só se você eliminar a instabilidade na origem.
Testes ponta a ponta (E2E) exercitam o sistema real do jeito que uma pessoa usa. Esse é o valor deles e também a maldição: cada camada que tocam é uma chance de ficarem lentos ou instáveis. Uma suíte E2E instável é pior que nenhuma, porque ensina o time a ignorar o vermelho.
Selecione elementos pela intenção, não pela estrutura
Seletores CSS e XPath amarrados ao layout quebram a cada redesenho. Prefira seletores semânticos e acessíveis, que espelham como uma pessoa encontra as coisas: papéis, rótulos e, para os poucos casos sem uma alça natural, identificadores de teste explícitos.
// ❌ Frágil: quebra quando a marcação ou o estilo muda
await page.click('div.toolbar > button:nth-child(2)');
// ✅ Resiliente: expressa a intenção de quem usa
await page.getByRole('button', { name: 'Save' }).click();
await page.getByLabel('Email').fill('user@example.com');
Nunca durma, espere por condições
Um sleep(2000) fixo é uma aposta de que o app sempre responde em menos de dois segundos. É lento demais numa máquina rápida e curto demais num runner de CI sobrecarregado. Espere, em vez disso, pelo estado que realmente importa.
// ❌ Tempo arbitrário: lento e ainda instável
await page.waitForTimeout(2000);
// ✅ Espere pelo resultado observável
await expect(page.getByText('Saved')).toBeVisible();
Atenção: Quase toda instabilidade em E2E é uma condição de corrida escondida: o teste confere antes de o app terminar. Asserções que tentam de novo sozinhas, e esperam pelo resultado na tela, eliminam a corrida em vez de disfarçá-la com pausas.
Mantenha os testes independentes e herméticos
- Cada teste monta e desmonta seus próprios dados, sem dependência de ordem entre testes.
- Controle o relógio, a rede e a aleatoriedade para que as execuções sejam determinísticas.
- Teste um resultado visível por teste; um megateste de 30 passos falha por cem motivos.
- Ponha em quarentena, nunca ignore: um teste instável pulado é uma lacuna silenciosa.
Compare como cada runner expressa essas ideias no playground Framework Comparison antes de amarrar a sua suíte a um só.