Dado de versão: o registro oficial de alterações do Cypress lista atualizações da série 16. Isso não muda a divisão de responsabilidades: o Cypress conduz o cadastro no navegador; uma tarefa controlada no Node ou uma interface de teste lê o e-mail. A sequência recomendada é acionar o envio, localizar a mensagem desta execução, extrair o código, concluir a validação e conferir o estado final da conta. Consulte o registro oficial de alterações do Cypress.

Adequado para: quem testa o cadastro e a validação de e-mail do próprio produto com Cypress 16. Não adequado para: quem precisa provar, apenas com uma caixa de teste interna, a entrega real em todos os provedores externos.

Este guia ajuda QA que mantém regressões do próprio cadastro e precisa separar interação de navegador e leitura de e-mail.
Também atende a pessoas desenvolvedoras que estão adicionando cobertura E2E e precisam escolher onde fazer as asserções.
Pequenas equipes de CI/CD podem usar o fluxo para evitar que contas pessoais reais virem infraestrutura de teste.

Última atualização: 22 de outubro de 2026. A versão e as referências do Cypress foram conferidas no registro de alterações, na documentação oficial de cy.task() e nas perguntas frequentes do Cypress. A integração de e-mail escolhida ainda precisa ser verificada na documentação correspondente: a existência do Cypress 16, por si só, não confirma compatibilidade com um plugin específico.

Antes de começar: defina o que o teste precisa provar

Um teste de cadastro com e-mail pode cobrir objetivos diferentes. Se a equipe não separar esses objetivos, é fácil interpretar um resultado positivo como prova de algo que o teste nunca verificou.

  • Fluxo da aplicação: o envio foi solicitado e a aplicação produziu uma mensagem de verificação com o conteúdo esperado.
  • Validação do código: o código recebido foi aceito, a interface mostrou o resultado previsto e a conta passou ao estado validado.
  • Entrega externa: a mensagem chegou a uma caixa de entrada fora do ambiente controlado, nas condições de entrega que interessam ao produto.

A leitura feita por uma tarefa Node ou por uma interface do ambiente de teste costuma servir aos dois primeiros objetivos, conforme a arquitetura do produto. Ela não comprova automaticamente o terceiro. Para testar entrega externa, planeje uma verificação de pré-produção com destinatário e condições conhecidos, separada da regressão rotineira.

O destino de teste deve ser controlado pela equipe e vinculado ao ambiente correto. Não use uma caixa pessoal de alguém da equipe nem uma conta de produção como destino recorrente: isso pode misturar dados reais com fixtures, expor informações pessoais em logs e encher uma caixa de trabalho com mensagens de regressão. A orientação sobre privacidade de dados ajuda a estabelecer limites para endereços e informações usadas em testes.

A escolha do destino depende do objetivo. Um serviço local de captura de e-mails ou uma interface de teste da própria aplicação pode permitir que o processo consulte mensagens sem depender de uma caixa pessoal. A FAQ oficial do Cypress é uma referência para distinguir recursos do framework de serviços externos que precisam ser integrados. Se a equipe preferir um endereço temporário para um teste próprio, avalie antes as características necessárias em um guia para escolher uma caixa de entrada de teste. O endereço precisa ser acessível pelo mecanismo de leitura que o projeto realmente usa; não presuma que qualquer caixa temporária ofereça uma API compatível com a automação.

Preparação: mantenha a execução isolada

Antes de abrir a página de cadastro, defina um contrato entre o teste no navegador e o mecanismo de leitura. Esse contrato precisa informar qual mensagem procurar e como relacioná-la à execução atual, sem passar credenciais de produção ao código do teste.

Um identificador pode ser um endereço específico de teste ou um marcador de execução que o sistema de e-mail controlado consiga encontrar. Se houver execuções paralelas, o destino ou o identificador deve evitar que duas tarefas consumam a mesma mensagem. O marcador não precisa ser um dado pessoal: prefira um identificador criado para o teste, que não contenha nome, e-mail real ou outro dado identificável.

Confira também o que os logs podem registrar. O conteúdo da mensagem pode conter o código; portanto, evite imprimir o corpo completo nos logs de CI. Registre informações de diagnóstico suficientes para localizar a falha — como ambiente, identificador da execução, assunto e etapa — e oculte o código e outros dados sensíveis sempre que possível.

Pergunta: onde esperar a mensagem durante um teste de cadastro no Cypress?
A espera deve acontecer na tarefa Node ou na interface de teste que consulta as mensagens, não em uma suposição de que o navegador consegue abrir uma caixa de entrada. A documentação de cy.task() descreve a passagem de trabalho do processo de teste para o Node. Use essa fronteira para chamar o mecanismo de leitura controlado pelo projeto.

Gatilho: envie o cadastro e marque a mensagem esperada

O Cypress deve executar as ações visíveis para a pessoa usuária: abrir o formulário, preencher os campos de teste e enviar o cadastro. Depois do envio, o teste precisa guardar o endereço de destino e o identificador de correlação escolhidos na preparação. Esses dados servem para pedir ao mecanismo de leitura a mensagem certa.

Um esqueleto de teste pode ser assim:

it('valida o cadastro pelo código recebido', () => {
  const runId = Cypress.env('RUN_ID');
  const email = makeTestAddress(runId);

  cy.visit('/cadastro');
  cy.get('[name="email"]').type(email);
  cy.get('[name="password"]').type(Cypress.env('TEST_PASSWORD'));
  cy.get('form').submit();

  cy.contains('Confira seu e-mail').should('be.visible');

  cy.task('mail:waitForVerification', { email, runId })
    .then(({ code, messageId }) => {
      cy.get('[name="verificationCode"]').type(code);
      cy.get('button[type="submit"]').click();
      cy.contains('E-mail confirmado').should('be.visible');

      return cy.task('account:getVerificationState', { email, runId })
        .then((state) => {
          expect(state.verified).to.equal(true);
          expect(messageId).to.be.a('string');
        });
    });
});

Os seletores, os nomes das tarefas e a forma de criar um endereço são exemplos estruturais, não APIs prontas do Cypress nem uma integração de caixa de entrada. Adapte-os às rotas e aos elementos do seu produto. A tarefa mail:waitForVerification precisa chamar o mecanismo real de leitura disponível no ambiente. A tarefa account:getVerificationState também precisa consultar uma fonte de estado de teste autorizada, em vez de inferir que a conta foi validada somente porque a página mostrou uma mensagem de sucesso.

Não use uma conta de outra plataforma ou um fluxo de cadastro alheio como alvo. O teste deve exercitar uma aplicação que a equipe controla, com dados criados para esse ambiente. Essa fronteira evita transformar um teste de produto em automação de cadastros de terceiros.

Recebimento: aguarde uma mensagem correspondente, não um intervalo fixo

Pergunta: como evitar que o teste leia um e-mail de uma execução anterior?
Faça a consulta exigir critérios associados à execução atual: destinatário, marcador, tipo de mensagem e, quando disponível, um identificador ou horário registrado pelo mecanismo de captura. Não selecione simplesmente “a mensagem mais recente” se a caixa for compartilhada por vários testes; uma mensagem nova de outro caso pode ser a mais recente e ainda assim ser a mensagem errada.

A tarefa no Node pode expor uma operação com esta forma:

on('task', {
  async 'mail:waitForVerification'({ email, runId }) {
    const message = await mailReader.findMatchingMessage({
      recipient: email,
      runId,
      template: 'verification',
    });

    if (!message) {
      throw new Error(`Mensagem de verificação não encontrada para ${runId}`);
    }

    return {
      code: extractVerificationCode(message.text),
      messageId: message.id,
    };
  },
});

mailReader e extractVerificationCode são abstrações a implementar com a ferramenta escolhida. A busca deve esperar até encontrar uma mensagem que corresponda aos critérios ou atingir um limite explícito de timeout. Um cy.wait() fixo pode mascarar uma corrida: se o e-mail chegar antes, o teste perde tempo; se chegar depois, o teste falha sem explicar se houve atraso, erro de envio ou consulta ao destino errado.

A documentação de cy.task() informa que taskTimeout tem valor padrão de 60 segundos. Esse limite se refere à execução da tarefa, não é uma recomendação para dormir por esse período antes de procurar uma mensagem. Ajuste o limite de acordo com o ambiente e com a operação realizada, e implemente a busca com tentativas limitadas e critérios claros. Se a tarefa não encontra o e-mail, devolva um erro que identifique o ambiente e a correlação da execução, sem revelar o código. Veja o comportamento documentado de cy.task() e taskTimeout.

A tarefa precisa resolver com um resultado serializável ou falhar de forma explícita. Se não houver mensagem, não devolva um valor indefinido que deixe o teste seguir com um estado ambíguo. Uma falha com contexto é mais útil do que uma asserção posterior de código vazio, porque aponta a etapa que não foi concluída.

Pergunta: como fazer o teste E2E de e-mail de cadastro no Cypress sem acoplar o navegador ao provedor?
Mantenha a consulta atrás de uma tarefa Node ou de um endpoint do ambiente de teste. Assim, a parte de navegador trata da interface, enquanto a integração de e-mail trata da busca e da extração. Essa separação também permite trocar o mecanismo de captura sem reescrever cada interação do formulário.

Validação: use o código e confira o estado persistido

Depois de receber a mensagem correspondente, extraia o código usando uma regra coerente com o formato criado pelo próprio produto. Se o código aparece como texto simples, uma expressão regular pode bastar; se o template muda conforme o idioma ou o canal, prefira identificar o conteúdo por uma estrutura estável ou por uma função testada separadamente.

Evite uma expressão que pegue qualquer sequência numérica do e-mail. A mensagem pode incluir datas, identificadores ou números de suporte. Se a extração produzir zero ou mais de um candidato, falhe com uma mensagem diagnóstica: a equipe precisa distinguir “o e-mail não chegou” de “chegou, mas o formato não corresponde ao esperado”. Não inclua o código integral no relatório de CI.

A submissão do código deve ocorrer pelo próprio fluxo da aplicação. Em seguida, verifique duas camadas:

  • Resposta visível: confirmação, navegação ou estado de interface previsto para um cadastro validado.
  • Estado da conta: consulta autorizada ao banco de teste, API interna ou mecanismo equivalente, verificando que o registro foi marcado como validado.

A segunda asserção evita que uma tela de sucesso esconda um defeito de persistência. A primeira evita que a aplicação atualize o estado interno sem fornecer a resposta esperada na interface. Para não criar dependência entre testes, use uma conta nova ou reinicialize o estado conforme as regras do ambiente; não reutilize um cadastro já validado como se fosse um fluxo limpo.

Repetição e falhas: preserve evidências úteis

Inclua cenários que correspondam às regras reais do produto. A validade do código, a possibilidade de reenviar e o tratamento de códigos anteriores variam conforme a implementação; não existe uma política universal que o teste possa presumir. Documente a regra do próprio sistema e escreva as asserções a partir dela.

Considere cobrir estas falhas:

  • Nenhuma mensagem correspondente: o teste deve falhar na etapa de recebimento e registrar destinatário de teste, identificador da execução e ambiente.
  • Código extraído não aceito: preserve o identificador da mensagem e confirme se a extração encontrou o conteúdo correto, sem expor o código nos logs.
  • Código incorreto: confirme a mensagem de erro e que a conta permanece no estado não validado.
  • Reenvio do cadastro ou da mensagem: confira se o sistema aplica a regra esperada e se a tarefa não seleciona uma mensagem antiga.
  • Validação incompleta: garanta que a conta continua não validada quando a pessoa não conclui o fluxo.

Uma falha deve dizer em qual etapa o fluxo parou. Isso reduz o tempo gasto tentando descobrir se o problema está no formulário, no envio, na captura, na extração ou na persistência. Para um registro de diagnóstico seguro, guarde identificadores e metadados mínimos; não armazene o conteúdo integral da caixa de entrada como artefato de CI.

Decisão para CI: automação de fluxo ou validação de entrega?

Use esta lista de condições antes de escolher o destino de e-mail:

  • Se o objetivo é testar interface, conteúdo e estado da conta, use uma caixa ou interface controlada pelo ambiente de teste e faça a leitura pela tarefa Node.
  • Se as execuções paralelas podem compartilhar mensagens, isole o destinatário ou inclua um identificador por execução e exija a correspondência antes de aceitar o e-mail.
  • Se o objetivo inclui provar a entrega fora do ambiente, não trate a captura interna como evidência suficiente; faça uma validação separada em pré-produção com condições de recebimento documentadas.
  • Se o fluxo precisa receber respostas ou manter histórico de longo prazo, não escolha um endereço temporário sem confirmar que ele atende a essas necessidades. Use um endereço de teste persistente, alias ou caixa controlada pela equipe.

Essa decisão evita misturar duas medições distintas: “a aplicação produziu uma mensagem que o ambiente de teste consegue consultar” e “um serviço externo entregou a mensagem como esperado”. A primeira é adequada para muitas regressões automatizadas; a segunda exige observar o caminho externo e registrar as condições do ensaio.

Necessidade do teste Caminho de recebimento O que a asserção pode provar Limite que precisa ficar claro
Regressão do cadastro Captura local ou interface controlada Fluxo da aplicação e conteúdo acessível ao teste Não comprova entrega em caixas externas
Teste com destinatário isolado Caixa de teste consultável pela tarefa Node Associação entre execução, mensagem e código Depende do acesso de leitura disponível
Aceitação de entrega externa Destinatário controlado em pré-produção Resultado observado nas condições registradas Não deve ser inferido de uma captura local
Conta que exige recuperação futura Caixa persistente sob controle da equipe Continuidade do recebimento, conforme a política adotada Um endereço temporário pode não ser apropriado

Na prática, o fluxo mais estável separa as responsabilidades: Cypress conduz o navegador, a tarefa Node consulta a mensagem e o ambiente de teste confirma o estado da conta. Um endereço temporário pode ser uma opção para cadastro de teste próprio quando o mecanismo de leitura for compatível e a necessidade for pontual. Para esse caso, o HourInbox oferece uma forma de usar uma caixa temporária sem cadastro e sem expor o endereço principal; ainda assim, a equipe deve confirmar que o destino escolhido funciona com a integração e a política de retenção de seu ambiente. Para um teste recorrente que exige histórico, resposta ou recuperação posterior, uma caixa persistente controlada pelo projeto é a escolha mais segura.

Mensagens temporárias para tarefas pontuais; contato permanente para o longo prazo.

Use uma caixa de entrada com contagem regressiva para tarefas únicas. Se ainda precisar receber mensagens depois, crie um alias permanente de encaminhamento.