Cypress: E2E que o time não abandona
A suíte E2E que nasce com entusiasmo e morre com skip: como evitar o ciclo com a dúzia vital, os 4 hábitos anti-flake e o lugar certo no CI (com vídeo da falha).
Todo time já viveu (ou vai viver) este ciclo: a suíte E2E nasce com entusiasmo, cresce sem critério, fica lenta e instável, e seis meses depois está com skip em metade dos testes. O problema quase nunca é a ferramenta; é usá-la contra a pirâmide. Este artigo fecha a série de testes com o Cypress (docs.cypress.io) usado do jeito que sobrevive: pouco E2E, do bom.
O papel certo: a dúzia vital
E2E responde uma única pergunta: "o sistema inteiro, integrado, entrega os fluxos que pagam as contas?" Login, busca, checkout, contratação. Uma dúzia de cenários, não trezentos. A regra já apareceu na série e vale repetir: regra de negócio se testa na base; costura, no meio; no topo, só a jornada completa.
describe("checkout", () => {
beforeEach(() => {
cy.task("db:seed", { produtos: 3 }); // dados controlados, via API
cy.login("cliente@teste.com"); // comando custom: login por API, não por tela
});
it("compra com cartão aprovado", () => {
cy.visit("/produtos");
cy.get("[data-cy=produto-card]").first().click();
cy.get("[data-cy=adicionar-carrinho]").click();
cy.get("[data-cy=ir-checkout]").click();
cy.intercept("POST", "/api/pagamento", { statusCode: 200, body: { status: "aprovado" } });
cy.get("[data-cy=confirmar-pedido]").click();
cy.get("[data-cy=pedido-confirmado]").should("contain", "Pedido confirmado");
});
});
O exemplo carrega os quatro hábitos anti-flake que separam a suíte viva da abandonada.
Os 4 hábitos anti-flake
1. Seletores dedicados (data-cy). Selecionar por classe CSS ou texto quebra a cada ajuste visual ou de copy. O atributo dedicado é um contrato explícito: "o teste depende disto"; muda quem sabe o que está mudando.
2. Zero wait de tempo fixo. cy.wait(3000) é a assinatura do flake: lento quando sobra, quebrado quando falta. O Cypress re-tenta asserções automaticamente até o timeout; espere por condições (should(...), esperar o alias de uma requisição intercetada), nunca por relógio.
3. Dados controlados, setup por baixo dos panos. Cada teste semeia o que precisa (cy.task falando com o banco, builders como sempre) e loga por API, não clicando na tela de login 40 vezes. UI se testa uma vez no teste dela; nos outros, é só o caminho até o alvo.
4. Fronteiras externas intercetadas. O gateway de pagamento real não pertence ao seu E2E: cy.intercept simula o aprovado, o recusado e o timeout, os contratos que você não controla ficam determinísticos.

No CI: o veredito final com evidência
O lugar do E2E na esteira: último estágio, contra o staging recém-deployado, como smoke de verdade. E o recurso subestimado do Cypress: screenshots e vídeos automáticos das falhas: o teste que quebrou às 2h vem com a gravação do que aconteceu, cortando o MTTD do diagnóstico de horas para minutos.
E a regra de gestão que mantém tudo de pé: E2E flaky é bug com prioridade. Um teste instável tolerado ensina o time a re-rodar sem ler, e a suíte inteira morre por descrédito.
E o Playwright?
A pergunta obrigatória de 2026. O Playwright cobre o mesmo território com paralelismo nativo, múltiplas engines e ótima velocidade; o Cypress mantém a experiência de desenvolvimento mais amigável (o runner interativo é imbatível para escrever e depurar). Os hábitos deste artigo valem identicamente para os dois: seletores dedicados, zero sleep, dados controlados, interceptação. Ferramenta é preferência; disciplina é o que decide o destino da suíte.
Montar a dúzia vital (com os comandos custom, o seed e o encaixe no CI) fecha a esteira de qualidade completa que implantamos no serviço de Qualidade e Testes.
Quantos testes E2E o seu time tem com skip hoje? Conte para a IA da Rabelo Digital, aqui no canto da tela, e ela ajuda a decidir o que ressuscitar, o que descer na pirâmide e o que apagar. Sem formulário, sem espera.


Deixe um Comentário