Ir para o conteúdo principal
Background Image

Do Unitário ao E2E - Um guia rápido para entender os tipos de testes funcionais em 2025

··9 minutos·
Rafael Issao
Autor
Rafael Issao
Apaixonado por tecnologia, programação e inovação. Adoro compartilhar conhecimento e aprender coisas novas todos os dias.
Tabela de conteúdos

Com as evoluções das ferramentas de testes, é possível escrever vários tipos de testes funcionais. Mas a finalidade de cada uma delas fica cada vez mais complicada de entender.

Neste artigo vou escrever um guia rápido sobre o que é, quando utilizar, características ideais e algumas observações para:

  • Testes de unidade ou unitários
  • Testes de integração
  • Testes de contrato
  • Testes de regressão visual
  • Testes E2E

Sistema de exemplo
#

Vamos utilizar o sistema de estoque como exemplo:

Arquitetura do sistema de gestão de estoque
Arquitetura do sistema de gestão de estoque

É um sistema de gestão de controle de estoque onde o processo de inventário é separado em um módulo à parte.

O usuário pode visualizar as informações do estoque e do inventário no browser ou no celular.

Teste unitário
#

Objetivo

Verificar comportamentos específicos de um módulo de forma isolada

Onde utilizar

4 módulos independentes testáveis com testes unitário
4 módulos independentes testáveis com testes unitário

Exemplo para o Sistema de Estoque

  • Comparando dois produtos, verificar qual vence antes.

Exemplo para o Módulo Inventário

  • Verificar se as regras de contagem de um item de estoque funciona corretamente

Exemplo para Frontend WEB

  • Verificar se é utilizado o componente correto para: estoque baixo, médio, alto

Exemplo para Frontend Mobile

  • Verificar se é utilizado o componente correto quando é lido um endereço que não existe no sistema

Características ideias

  • A execução de um teste deve levar milissegundos
  • Quando falha o teste, o feedback do teste deve ser específico

Observação

É o tipo de teste que traz a maior quantidade de feedback rápido. Mas existem algumas dificuldades por ser o único teste puramente caixa branca.

Este tipo de teste depende diretamente da qualidade do código. Ou seja, quanto melhor a qualidade do código testado, mais simples de escrever o teste unitário.

Mas sabemos que a maioria dos projetos possuem um código de qualidade baixo, consequentemente um design que não favorece a testabilidade das unidades, criando um ambiente dentro da equipe que dificulta a escrita dos testes unitários.

Um outro desafio é que a compreensão sobre testes unitários é diferente no backend e no frontend. Por exemplo, existe o conceito de testes de widgets ou testes de componentes em frontend. Estes podem ser considerados como unitários ou não dependendo da definição da equipe.

Outro desafio no frontend é que deveria ter poucos testes unitários pois este módulo não é responsável pela regra de negócio. É responsável pela visualização dependendo da plataforma. No nosso exemplo, mobile ou web.

Mas muitas equipes escrevem tantas regras de negócio no frontend que surge uma necessidade real e desnecessária da escrita dos testes unitários no frontend.

Na minha honesta experiência, as pessoas que têm um domínio na escrita dos testes unitários, têm um domínio sobre o design e a arquitetura do código.

Teste de integração
#

Objetivo

Testar as partes integradas que os testes unitários não conseguem verificar.

Onde utilizar

Exemplo Estoque+Banco de dados

  • Verificar se o fluxo de separação de um produto funciona corretamente

Exemplo Inventário+Banco de dados

  • Verificar se um fluxo de um inventário funciona corretamente

Características ideais

  • Ambiente de teste bem configurado e replicável (No exemplo temos dois ambientes de teste de integração)
  • Boa gestão automática para massa de dados
  • A execução de um teste deve levar segundos
  • Testes isolados para possibilitar execução paralela

Observação

É o tipo de teste que traz mais confiança sobre a funcionalidade do sistema, mas em compensação o custo para mantê-las é mais alto que um teste unitário por começar a depender de fatores externos.

Os fatores externos que podem fazer um teste falhar:

  • Massa de dados incorreto
  • Falta de atualização no banco de dados
  • O teste falha somente quando executado em conjunto (falta de isolamento)
  • Falta de configuração no banco de dados

Todas essas falhas são parte do ambiente de teste e não é um erro específico do comportamento do sistema. Essas falhas fazem a equipe começar a abandonar ou ignorar os testes de integração.

O ambiente de teste torna-se então um fator importante.

Existe também o abandono dos testes unitários por testes de integração. Isso ocorre quando a equipe tem dificuldade de escrever um bom teste unitário por falta de testabilidade no design criado pela própria equipe.

É importante escrever testes de integração, mas sempre em conjunto com testes unitários.

Testes de Contrato
#

Objetivo

Garantir que o protocolo de comunicação entre os módulos sempre esteja correto. Ou seja, existe um contrato que os dois módulos devem cumprir.

Onde utilizar

Exemplo Estoque -> Frontend WEB e Mobile

  • Para a tela de quantidade de estoque no endereço, deve enviar a informação no seguinte formato:
{
  Nome: String,
  Lote: String,
  Validade: String,
  Quantidade: Inteiro,
}

Exemplo Estoque-> Módulo Inventário

  • Para a informação do produto, deve enviar a informação no seguinte formato:
{
  Nome: String,
  Lote: String,
  Validade: String,
  Quantidade: Inteiro,
}

Exemplo Inventário -> Frontend WEB e Mobile

  • A consulta de contagem deve enviar a informação no seguinte formato:
{
  Endereco: String,
  idProduto: Inteiro,
  responsavel: String,
  idContagem: Inteiro
}

Características ideais

  • O consumidor (Frontend e inventário) deve ser o mandante do contrato
  • O provedor deve sempre cumprir o contrato gerado pelo consumidor
  • O teste de contrato no lado do consumidor deve ser unitário
  • O teste de contrato no lado do provedor deve ser integração
  • A velocidade de execução deve estar de acordo com o tipo de teste

Observação

Teste de contrato surgiu como um tipo de teste para eliminar a dependência de ter dois módulos em execução.

A ideia é testar o consumidor e o provedor isoladamente a partir do contrato fornecido.

Exige um conhecimento bom sobre testes unitários e de integração para verificar se o contrato ainda é cumprido tanto no consumidor quanto no provedor.

Uma dificuldade que surge neste tipo de teste é quando existe um time responsável por cada módulo. Exige uma boa coordenação para que as duas equipes consigam desenvolver independentemente sem bloqueios.

Outra dificuldade é a curva de aprendizagem. Por ser um tipo de teste que surgiu recentemente, as boas práticas sobre testes de contrato ainda são poucos conhecidas.

Mas é um tipo de teste que é válido criar quando o seu sistema “conversa” com muitos módulos e fica custoso subir todos os módulos ao mesmo tempo.

Teste de Regressão Visual
#

Objetivo

Verificar se a interface do usuário foi alterada quando comparada com um snapshot inicial válido.

Onde utilizar

Exemplo

Os exemplos são os snapshots das telas WEB ou Mobile escolhido pela equipe

Características ideais

  • Ambiente de teste que não dependa de outros módulos
  • Facilidade em criar Mocks de request e response
  • Dados que são utilizadas na interface devem ser o mais próximo da realidade
  • Verificar somente os fluxos mais utilizados em produção

Observação

Este tipo de teste é o mais importante no frontend pois foca na parte visual do sistema.

Quando temos um snapshot válido do sistema com todas as informações e botões aparecendo de forma correta, garantimos que bugs visuais não ocorram em ambiente de produção.

A dificuldade deste tipo de teste é a criação de ambiente com módulos falsos. O famoso mock.

Quando criamos mocks de módulo, criamos uma complexidade extra pois o mock sempre deve acompanhar a mudança do módulo que ele está simulando. É um trabalho extra.

Mas mock se torna importante pois não queremos que o texto das telas fique alterando toda hora.

Mas é possível eliminar este trabalho se tivermos o teste de contrato funcionando. Podemos gerar mocks a partir do contrato definido mas exige um esforço técnico incial.

Outro desafio é que este teste é caixa branca. Parece ser caixa preta pois focamos na parte visual mas ainda temos que interagir com as ações dos botões e entender os dados enviados no request e response.

E, novamente, quando o código não é de qualidade, a escrita de um teste de regressão se torna novamente complexa, dificultando a adoção deste tipo de teste.

Teste E2E
#

Objetivo

Verificar o fluxo mais utilizado pelo usuário final ou o fluxo que gera lucro para a empresa.

Onde utilizar

Exemplo

  • Verificar se a separação dos itens ocorre sem problemas, junto com o processo de inventário. (Neste caso, a separação dos itens é um processo muito frequente e utilizado pelo usuário. Se este processo travar, travamos o processo inteiro do cliente).

Características ideais

  • Simular ou utilizar o ambiente de produção
  • Possibilidade de realizar vários testes funcionais e não-funcionais no mesmo ambiente
  • Ter poucos testes deste tipo

Observação

Testes E2E são os testes que ficam mais próximos da realidade do usuário final. Em compensação é o ambiente mais custoso de manter.

Existem situações onde este tipo de teste não é necessário. Tais situações ocorrem quando o projeto possui um conjunto confiável de testes unitários, integração e de contrato.

Mas quando este conjunto confiável de testes não existe, muitas equipes recorrem também para este tipo de teste mais custoso sem as vantagens oferecidas por ela.

A principal vantagem deste tipo de teste é a garantia de que você não vai gerar problemas críticos para o cliente no fluxo principal e a possibilidade de simular situações de bugs que só é reproduzível em um ambiente parecido ou igual a de produção.

É o tipo de teste que deve ser feito em conjunto com uma boa estratégia de testes.

Criar este tipo de teste sem uma estratégia que envolve custo, manutenção e vantagens oferecidas por ela, é uma receita pronta para falhar e ficar abandonado.

Conclusão

Essa é uma lista de tipos de teste automatizados que geram mais impacto positivo para um projeto.

Se você e sua equipe souberem qual o tipo de teste que deve ser utilizado e escreverem um teste de qualidade, os testes serão valorizados e a cultura de testes automatizados melhora naturalmente com o tempo.

Recomendo muito começar a escrever os testes pelo mais simples e depois ir para um nível acima de complexidade:

  1. Teste unitário ou de unidade: É o mais simples pois não precisa do ambiente de teste.
  2. Teste de integração: É parecido com unitário mas envolve ambiente de teste bem feito.
  3. Teste de contrato: Exige conhecimento sobre testes unitários e de integração.
  4. Teste de regressão visual: Exige um conhecimento diferente dos testes anteriores mas o conhecimento sobre ambiente de teste ajuda.
  5. Teste E2E: É o mais complicado e exige todos os conhecimentos anteriores. Precisa ter também o conhecimento o suficiente para decidir se vale a pena ou não começar a escrever testes E2E.

Comece com testes unitários e, aos poucos, avance para os mais complexos. Automatize o que for repetitivo (ex: E2E de fluxos-chave) para ganhar eficiência!

Você já escreveu quais tipos de teste? Tem algum interessante que não tem listado aqui?

Comenta ou vem falar comigo!

Se tiverem mais curiosidade sobre o assunto ou quiserem sugerir um tema que eu conheça, podem falar comigo ou enviar um comentário!

🥒🥒 Espero que tenham curtido e até o próximo artigo! 🥒🥒