Guia Completo: Testes E2E com Cypress e Angular

Do zero à automação, com IA para acelerar sua produtividade.

Instalação e Configuração Inicial

Instalação Automática (Recomendada)

A maneira mais simples de adicionar o Cypress a um projeto Angular é usando o schematic oficial. Ele cuida de toda a configuração para você.

ng add @cypress/schematic

Este comando instala o Cypress, configura os arquivos necessários e adiciona scripts ao package.json.

Iniciando o Test Runner

Após a instalação, inicie o Cypress Test Runner (a interface interativa de testes) pela primeira vez:

ng e2e

Este comando abre a interface visual do Cypress onde você pode criar, executar e depurar seus testes.

Estrutura Criada

O schematic cria automaticamente a seguinte estrutura:

  • cypress.config.ts - Arquivo de configuração principal
  • cypress/e2e/ - Pasta para testes end-to-end
  • cypress/fixtures/ - Arquivos de dados para os testes
  • cypress/support/ - Comandos customizados e configurações

Criação de Testes: Do Básico ao Avançado

Aprenda três métodos diferentes para criar testes E2E, desde escrever código manualmente até usar IA para geração automática.

💻

Método 1: Código

Abordagem tradicional de escrever testes manualmente com controle total sobre o comportamento.

🎥

Método 2: Gravação

Use extensões de navegador para gravar suas ações e convertê-las em código Cypress automaticamente.

🤖

Método 3: IA

Inteligência artificial para gerar cenários de teste e código Cypress de forma automática.

🧩

Cy‑Fi (Extensão)

Grave ações no navegador e gere código Cypress automaticamente. Ideal para acelerar o bootstrap de testes.

Método 1: Escrevendo Testes Manualmente

Esta é a abordagem mais poderosa e flexível, onde você tem controle total sobre o fluxo do teste escrevendo o código diretamente.

✅ Passo 1: Criando o Primeiro Teste

Crie um arquivo cypress/e2e/app.cy.ts e adicione um teste básico para verificar se a página principal carrega corretamente.

describe('Testes da Página Principal', () => {
  beforeEach(() => {
    cy.visit('/');
  });

  it('Deve exibir a mensagem de boas-vindas', () => {
    cy.get('h1').should('contain.text', 'Welcome');
  });

  it('Deve exibir o botão de login', () => {
    cy.get('[data-cy="login-button"]').should('be.visible');
  });
});

💡 Dicas importantes:

  • Use data-cy como seletor para elementos (melhor que classes CSS)
  • Sempre adicione beforeEach para setup comum
  • Use asserções descritivas com .should()

✅ Passo 2: Comandos Customizados

Para lógicas repetitivas como login, crie comandos próprios em cypress/support/commands.ts.

// cypress/support/commands.ts
Cypress.Commands.add('login', (username: string, password: string) => {
  cy.visit('/login');
  cy.get('[data-cy="username-input"]').type(username);
  cy.get('[data-cy="password-input"]').type(password);
  cy.get('[data-cy="login-button"]').click();
  cy.url().should('include', '/dashboard');
  cy.get('[data-cy="welcome-message"]').should('be.visible');
});

// Exemplo de uso:
describe('Teste de Login', () => {
  it('Login com credenciais válidas', () => {
    cy.login('usuario@teste.com', 'senha123');
    cy.get('[data-cy="dashboard-title"]').should('contain', 'Dashboard');
  });
});

✅ Passo 3: Variáveis de Ambiente

Configure o arquivo cypress.config.ts para gerenciar dados sensíveis e configurações.

import { defineConfig } from 'cypress'

export default defineConfig({
  e2e: {
    baseUrl: 'http://localhost:4200',
    viewportWidth: 1280,
    viewportHeight: 720,
    video: true,
    screenshotOnRunFailure: true,
    env: {
      login_user: 'testuser@example.com',
      login_password: 'securepassword123',
      api_url: 'https://api.exemplo.com'
    },
    retries: {
      runMode: 2,
      openMode: 0
    }
  },
});

Acesse as variáveis nos testes com Cypress.env('login_user').

2.2

Método 2: Gravando Testes com Extensão

Para acelerar a criação, use uma extensão de navegador que grava suas ações e as converte em código Cypress automaticamente.

🎬 Como Usar Extensões de Gravação

  1. 1
    Instale uma extensão: Procure por "Cypress Recorder" ou "Cy-Fi" na Chrome Web Store
  2. 2
    Configure: Abra o DevTools (F12) na sua aplicação Angular
  3. 3
    Inicie a gravação: Vá para a aba da extensão e clique em "Record" ou "Start Recording"
  4. 4
    Interaja: Clique em botões, preencha formulários, navegue pela aplicação
  5. 5
    Finalize: Pare a gravação e copie o código gerado

🔧 Ajustando o Código Gerado

O código gerado pela extensão geralmente precisa de ajustes para seguir as melhores práticas:

❌ Código gerado (pode ter problemas):

cy.get('.btn-primary').click();
cy.get('#username').type('user');
cy.get('.form-input').type('pass');

✅ Código ajustado (boas práticas):

cy.get('[data-cy="login-button"]').click();
cy.get('[data-cy="username-input"]').type('user');
cy.get('[data-cy="password-input"]').type('pass');

🔧 Melhorias adicionais:

  • Adicione asserções .should('be.visible')
  • Use beforeEach para setup
  • Adicione waits explícitos se necessário
2.3

Método 3: Geração com IA (No-Code)

Utilize inteligência artificial para planejar, simular e gerar o código dos seus testes, ideal para ter novas ideias e acelerar o desenvolvimento.

🤖 Gerando Cenários de Teste com IA

Descreva a funcionalidade da sua aplicação e deixe a IA sugerir cenários de teste completos (caminhos felizes e de erro).

🎮 Simulação Visual Interativa

Crie componentes da sua aplicação visualmente e teste interações antes de gerar o código Cypress final.

Crie seu Cenário de Teste

Componentes Adicionados:

Nenhum componente adicionado.

🚀 Benefícios do Método IA

✅ Vantagens

  • Ideias criativas para cenários de teste
  • Identificação automática de edge cases
  • Geração rápida de código boilerplate
  • Consistência nos padrões de teste
  • Documentação automática dos testes

🔧 Como Usar

  • 1. Descreva sua funcionalidade
  • 2. Clique em "Gerar Cenários com IA"
  • 3. Crie componentes no playground
  • 4. Teste interações visuais
  • 5. Gere o código Cypress final

Cy‑Fi: Gravador de Ações → Código Cypress

A Cy‑Fi é uma extensão de navegador que grava suas ações em páginas web e gera código Cypress automaticamente. Ideal para iniciar rapidamente suítes de testes sem escrever tudo do zero. Link para a Chrome Web Store.

🔎 Visão Geral

De acordo com a página oficial da extensão, a Cy‑Fi "records user actions on a web page and generates Cypress code for automation and testing." Ela oferece:

  • Uso de comandos do @testing-library/cypress para seletores melhores
  • Interface amigável, grava cliques, digitação, navegação e submissões
  • Geração automática de código + editor integrado para editar/remover ações
  • Pausar/retomar gravação e copiar o código para a área de transferência
  • Inspector para encontrar o melhor seletor do elemento
  • Inserção de assertions baseada no elemento

Fonte: Cy‑Fi — Chrome Web Store.

⚙️ Como Usar

Passos básicos

  • Abra a extensão e clique em Play para iniciar a gravação
  • Acompanhe suas ações pelo popup da extensão
  • Clique em Stop para encerrar ou Resume para continuar
  • Use Reset para limpar ou Copy para copiar o código

Inspector & Assertions

  • Clique em Inspect e selecione um elemento para obter o seletor cy.get(...) (ESC para sair)
  • Para assertions: inicie a gravação e pressione ALT(Win)/OPTION(Mac) + clique direito no elemento; escolha a asserção

🧩 Exemplo de Código Gerado

Após gravar um fluxo de login simples, um resultado típico pode ser:

it('fluxo básico de login (Cy‑Fi)', () => {
  cy.visit('/login');
  cy.get('[data-cy="username-input"]').type('user@teste.com');
  cy.get('[data-cy="password-input"]').type('SenhaSegura123');
  cy.get('[data-cy="submit-login"]').click();
  cy.url().should('include', '/dashboard');
});

Ajuste seletores para data-cy, centralize credenciais via Cypress.env e adicione asserções de negócio.

✅ Boas Práticas ao usar a Cy‑Fi

  • Substitua seletores frágeis (classes/ids dinâmicos) por data-cy
  • Inclua asserções claras após cada ação importante
  • Refatore o código gerado em commands.ts quando reaproveitável
  • Use fixtures e intercept para dados/mocks

Referência: Cy‑Fi — Chrome Web Store.

Estratégias de Teste

Diretrizes práticas para o que testar, como testar, onde testar e como preparar dados/mocks. Use os exemplos de Cypress prontos para copiar.

✅ Caminho Feliz (Happy Path)

Foque nos fluxos críticos e mais usados que precisam funcionar sempre.

O que testar

  • Autenticação básica (login/logout)
  • Fluxos de compra/pagamento
  • Cadastro e edição de perfis
  • Navegação principal e carregamento de páginas

Como/onde testar

  • Ambiente de staging com dados realistas
  • Mocks mínimos: prefira back-end real quando possível
  • Use seletores data-cy estáveis

Exemplo Cypress

describe('Checkout - caminho feliz', () => {
  it('deve completar uma compra', () => {
    cy.visit('/');
    cy.get('[data-cy="login-button"]').click();
    cy.get('[data-cy="username-input"]').type('user@teste.com');
    cy.get('[data-cy="password-input"]').type('SenhaSegura123');
    cy.get('[data-cy="submit-login"]').click();

    cy.get('[data-cy="product-card"]').first().within(() => {
      cy.get('[data-cy="add-to-cart"]').click();
    });

    cy.get('[data-cy="open-cart"]').click();
    cy.get('[data-cy="checkout"]').click();
    cy.get('[data-cy="order-success"]').should('be.visible');
  });
});

❌ Caminhos de Erro (Sad Paths)

Cobrem validações, permissões e falhas externas. Priorize mensagens claras e comportamentos previsíveis.

Validações

  • Campos obrigatórios e formatos (email, CPF, CEP)
  • Limites (mín/máx de caracteres, quantidade, preço)
  • Erros inline e desabilitar envio inválido

Permissões

  • Redirecionar anônimos para login
  • Bloquear acesso a rotas/admin para perfis comuns

Falhas externas

  • Timeouts/500 de API (simulados com cy.intercept)
  • Indisponibilidade de serviços (pagamento, CEP)

Exemplo Cypress com intercept/mocks

describe('Login - caminhos de erro', () => {
  it('deve mostrar erro de credenciais inválidas', () => {
    cy.intercept('POST', '/api/login', { statusCode: 401, body: { message: 'Credenciais inválidas' } });
    cy.visit('/login');
    cy.get('[data-cy="username-input"]').type('user@teste.com');
    cy.get('[data-cy="password-input"]').type('errada');
    cy.get('[data-cy="submit-login"]').click();
    cy.get('[data-cy="toast-error"]').should('contain', 'Credenciais inválidas');
  });
});

📦 Dados de Teste e Mocks

Onde armazenar

  • cypress/fixtures/ para JSONs estáticos
  • Geração dinâmica via helpers no support/

Como usar

  • cy.fixture('user.json') para carregar dados
  • cy.intercept() para simular APIs
  • Variáveis em Cypress.env para segredos

Exemplo

it('deve listar produtos mockados', () => {
  cy.fixture('products.json').then((products) => {
    cy.intercept('GET', '/api/products', { statusCode: 200, body: products });
  });
  cy.visit('/catalogo');
  cy.get('[data-cy="product-card"]').should('have.length.at.least', 1);
});

Evidências de Teste

Como configurar, gerar e localizar evidências em vídeo e em screenshots no Cypress.

🎥 Evidências em Vídeo

O Cypress grava vídeos automaticamente no modo headless. Você também pode forçar a gravação por configuração.

Passo a passo

  1. Habilite vídeos no cypress.config.ts
  2. Execute os testes em modo headless
  3. Recupere os arquivos na pasta configurada

Configuração

import { defineConfig } from 'cypress'

export default defineConfig({
  e2e: {
    video: true,
    videosFolder: 'cypress/videos',
    screenshotOnRunFailure: true
  }
});

Comando

npx cypress run --browser chrome

Onde encontrar

cypress/videos/ (um .mp4 por spec)

📸 Evidências em Screenshots

O Cypress cria screenshots automaticamente em falhas no modo headless e permite capturas manuais em pontos estratégicos.

Passo a passo

  1. Habilite screenshotOnRunFailure na configuração
  2. Use cy.screenshot() para capturas manuais
  3. Recupere os arquivos na pasta configurada

Exemplo prático

it('captura evidências do fluxo de login', () => {
  cy.visit('/login');
  cy.screenshot('login-inicial');
  cy.get('[data-cy="username-input"]').type('user@teste.com');
  cy.get('[data-cy="password-input"]').type('SenhaSegura123');
  cy.screenshot('login-pre-submit');
  cy.get('[data-cy="submit-login"]').click();
  cy.screenshot('login-sucesso');
});

Configuração

import { defineConfig } from 'cypress'

export default defineConfig({
  e2e: {
    screenshotOnRunFailure: true,
    screenshotsFolder: 'cypress/screenshots'
  }
});

Onde encontrar

cypress/screenshots/ (pastas por spec e por teste)

Automação CI/CD

Execute seus testes E2E automaticamente a cada push/PR usando GitHub Actions. Abaixo um workflow completo e dicas práticas.

🚀 Workflow GitHub Actions

Crie o arquivo .github/workflows/cypress.yml:

name: Angular CI with Cypress

on:
  push:
    branches: [ "main", "develop" ]
  pull_request:
    branches: [ "main", "develop" ]

jobs:
  build-and-test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Setup Node
        uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: npm

      - name: Install
        run: npm ci

      - name: Build
        run: npm run build --if-present

      - name: Start app (background)
        run: |
          npm run start &
        env:
          CI: true

      - name: Wait for app
        run: npx wait-on http://localhost:4200

      - name: Cypress Run
        run: npx cypress run --browser chrome
        env:
          CYPRESS_baseUrl: http://localhost:4200

      - name: Upload videos
        if: always()
        uses: actions/upload-artifact@v3
        with:
          name: cypress-videos
          path: cypress/videos

      - name: Upload screenshots
        if: always()
        uses: actions/upload-artifact@v3
        with:
          name: cypress-screenshots
          path: cypress/screenshots

⚡ Dicas de Otimização

Execução Paralela

  • Divida specs e use --parallel com Cypress Dashboard
  • Estruture specs curtas e independentes

Matriz de Browsers

  • Valide em múltiplos navegadores (chrome, firefox, edge)
  • Use strategy.matrix no workflow

🔐 Segredos e Variáveis

Configure segredos no repositório e injete-os como variáveis de ambiente:

- name: Cypress Run
  run: npx cypress run
  env:
    CYPRESS_login_user: ${{ secrets.LOGIN_USER }}
    CYPRESS_login_password: ${{ secrets.LOGIN_PASSWORD }}

Cypress Preview: IA no Cypress Studio

Cypress revelou uma versão preview com foco em IA para acelerar a criação de testes automatizados. A atualização prepara o terreno para a próxima era da criação de testes assistida por IA, permitindo gravação, edição em linha e sugestões mais inteligentes na interface do Cypress.

✨ Visão Geral

O Cypress Studio agora, em versão preview, permite:

  • Gravar interações do usuário e gerar código Cypress automaticamente
  • Edição em tempo real dos testes direto na interface do Cypress
  • Geração de seletores aprimorada e sugestões de assertions com IA
  • Base técnica preparada para entender intenção do usuário e criar cenários mais complexos

⚙️ Como habilitar a versão Preview

Passos

  • Atualize para a versão mais recente do Cypress
  • Habilite a flag experimental no arquivo de configuração
  • Abra o Preview e use o Studio para gravar e editar testes

Comandos

npm i -D cypress@latest
npx cypress open

Configuração

import { defineConfig } from 'cypress'

export default defineConfig({
  e2e: {
    baseUrl: 'http://localhost:4200',
    experimentalStudio: true // habilita o Studio em modo preview
  }
});

🎬 Vídeo: Primeiro teste E2E (visita e asserção)

Assista a uma gravação curta demonstrando a criação e execução de um teste E2E no Cypress.

Fonte: Cypress Docs - First test video.

🧪 Usando o Cypress Studio com IA

Fluxo sugerido

  • Abra o Preview (UI) e selecione a spec ou crie uma nova
  • Habilite o Studio e grave as interações (cliques, digitações, navegação)
  • Use o clique com botão direito para adicionar asserções automaticamente
  • Edite o teste em linha direto na interface
  • Peça sugestões de seletores/asserções quando disponíveis

Exemplo gerado

it('preenche o formulário e valida sucesso', () => {
  cy.visit('/cadastro');
  cy.get('[data-cy="nome-input"]').type('João Teste');
  cy.get('[data-cy="email-input"]').type('joao@teste.com');
  cy.get('[data-cy="submit-button"]').click();
  cy.get('[data-cy="toast-success"]').should('contain', 'Cadastro realizado');
});

🔍 Outras novidades da versão

  • Comandos como cy.url(), cy.hash(), cy.go(), cy.reload(), cy.title() e cy.location() passam a usar CDP/WebDriver BiDi, evitando erros de origem cruzada
  • Suporte a Vite 7 e Angular 20 no Teste de Componentes

Exemplo de configuração de Component Testing

import { defineConfig } from 'cypress'

export default defineConfig({
  component: {
    devServer: {
      framework: 'angular',
      bundler: 'vite' // Vite 7
    }
  }
});

Complementos: Iframe e Relatórios (Mochawesome)

Conteúdo adaptado a partir de um guia interno (Criado por Jeferson Dal Molin, última alteração em 27 jun, 2022). Tempo estimado de leitura: ~3 minutos.

📦 Instalação de pacotes

Exemplo baseado em um projeto Angular (pasta totvs-hgp-hvp-config/thf2 no VSCode).

Cypress

npm i cypress@10.2.0 --save-dev

Iframe (PO-UI)

Como PO‑UI renderiza telas em iframe, use o plugin:

npm i cypress-iframe@1.0.1 --save-dev

Relatórios

npm i mochawesome@7.1.3 --save-dev

⚙️ Configuração (cypress.config.ts)

Exemplo de opções úteis: requestTimeout estendido (ambientes lentos) e reporter do Mochawesome.

import { defineConfig } from 'cypress'

export default defineConfig({
  e2e: {
    baseUrl: 'http://localhost:4200',
    requestTimeout: 60000, // padrão 5000ms
    experimentalStudio: false
  },
  reporter: 'mochawesome',
  reporterOptions: {
    reportDir: 'report',
    overwrite: true,
    html: true,
    json: true
  }
});

🧩 Suporte a Iframe (cypress-iframe)

Importação em support/e2e.ts

// support/e2e.ts
import 'cypress-iframe';
// outros imports/support

Uso no teste

it('interage dentro do iframe', () => {
  cy.visit('/po-ui-exemplo');
  cy.frameLoaded('iframe#po-ui');
  cy.iframe().find('[data-cy="botao-confirmar"]').click();
});

🧪 Estrutura de Testes (e2e)

Organize cypress/e2e por módulos/funcionalidades. Exemplo simples:

cypress/
  e2e/
    auth/
      login.cy.ts
    pedidos/
      checkout.cy.ts
  fixtures/
  support/
    commands.ts
    e2e.ts

▶️ Execução e Relatórios

Com interface (Preview)

npx cypress open

Escolha E2E Testing, o navegador e a spec.

Headless + Mochawesome

npx cypress run

Relatórios em /report e vídeos/screenshots nas pastas padrão.