Como distribuir os testes de um site ou sistema para encontrar falhas cedo, proteger jornadas importantes e manter a automação sustentável.
Uma atualização no formulário de orçamento pode passar pela revisão de código e, ainda assim, impedir que uma solicitação seja salva. Em outro projeto, a equipe pode esperar longos minutos por testes de navegador que falham de maneira intermitente. Os dois problemas pedem uma estratégia de testes que relacione cada risco à verificação adequada.
A pirâmide de testes ajuda a organizar essa escolha. A proposta é combinar verificações pequenas e rápidas com testes que exercitam integrações e algumas jornadas completas. O equilíbrio depende das funcionalidades, da arquitetura e das consequências de uma falha.
O que é a pirâmide de testes e qual problema ela resolve?
A pirâmide de testes é um modelo para distribuir verificações automatizadas por escopo. Na representação mais conhecida, a base reúne testes unitários, o meio concentra testes de integração e o topo contém testes amplos de jornadas, frequentemente chamados de end-to-end.
Essa distribuição busca oferecer retorno rápido e facilitar o diagnóstico. Quando uma regra de cálculo falha em um teste isolado, há poucas partes para investigar. Quando uma jornada completa falha, o problema pode estar na interface, na API, no banco ou na configuração do ambiente.
Considere um site que recebe pedidos de orçamento. A mesma funcionalidade pode ser examinada em três níveis:
- Unidade: verificar se a regra calcula corretamente o desconto permitido.
- Integração: confirmar se a API valida e grava a solicitação no banco.
- Jornada: preencher o formulário pelo navegador e verificar a conclusão do envio.
Os limites precisam ser combinados pela equipe. Um teste de componente com dependências simuladas tem um alcance diferente de outro que acessa serviços reais, mesmo quando ambos recebem o nome de teste de interface.
A pirâmide não estabelece percentuais universais. Ela orienta a escolha de escopos que ofereçam confiança com custo sustentável. Uma suíte numerosa pode deixar passar um problema importante se nenhuma verificação observar o comportamento afetado.
Essa estratégia também se beneficia de código compreensível, com responsabilidades claras. As orientações de Clean Code na prática ajudam a discutir essa organização sem transformar convenções em regras absolutas.
Testes unitários: proteja regras de negócio com retorno rápido
Testes unitários verificam pequenas unidades de comportamento em isolamento. Podem examinar uma função de cálculo, uma regra de elegibilidade ou uma transformação de dados, sem depender de banco real ou serviço externo.
O melhor ponto de partida costuma ser o código que concentra decisões relevantes. No orçamento, isso inclui valor mínimo, limite de desconto, campos obrigatórios e critérios de arredondamento definidos pelo negócio.
Uma seleção útil de cenários seria:
- Um orçamento válido sem desconto.
- Um desconto exatamente no limite permitido.
- Um desconto acima do limite, com a rejeição esperada.
- Entradas ausentes, negativas ou em formato inválido.
- Valores que exercitem a regra adotada para arredondar centavos.
O teste deve verificar resultados observáveis. Se o comportamento esperado é rejeitar um desconto inválido, a verificação precisa observar essa rejeição. Exigir que métodos privados sejam chamados em determinada ordem pode tornar o teste sensível a reorganizações que preservam o comportamento.
Mocks e stubs ajudam a controlar dependências. Um stub pode devolver uma cotação conhecida; um mock pode verificar uma interação necessária. Porém, ambos representam versões simuladas: não demonstram que a comunicação com o serviço real funciona.
Componentes de interface também podem ser testados isoladamente. A equipe deve documentar sua classificação e, principalmente, deixar claro o que cada teste exercita. A relação entre essas escolhas e o trabalho futuro é discutida no conteúdo sobre testes automatizados e custos de manutenção.
Testes de integração: verifique banco de dados, APIs e contratos
Uma regra pode funcionar isoladamente enquanto a aplicação falha ao salvar seus resultados. Testes de integração verificam a colaboração entre partes: aplicação e banco, endpoint e autenticação, ou adaptador e serviço externo.
Declare o escopo de cada conjunto. Por exemplo: “esta suíte executa a API e um banco de testes, mas substitui o provedor de e-mail”. Essa descrição esclarece quais falhas ela pode detectar e quais exigem outra verificação.
Persistência e comportamento da API
No site de orçamento, um teste pode enviar uma requisição válida, consultar o banco e conferir os dados persistidos. Outros devem exercitar entradas inválidas, permissões aplicáveis e respostas de erro, verificando também se operações rejeitadas deixam de gravar dados indevidos.
Use um banco de testes compatível com os comportamentos que precisam ser validados. Restrições, consultas e transações podem se comportar de maneira diferente entre tecnologias; uma substituição simplificada pode esconder justamente o problema procurado.
Serviços externos e contratos
O envio de e-mail pode ser testado separadamente pelo adaptador responsável pela comunicação. Simulações controladas permitem reproduzir indisponibilidade, demora e respostas inesperadas. Quando necessário, um ambiente de testes do fornecedor ajuda a verificar a integração real.
Testes de contrato verificam acordos de comunicação, como campos, tipos e respostas esperadas entre consumidor e provedor. Eles ajudam a identificar incompatibilidades, mas não comprovam, sozinhos, que credenciais, rede e configuração do ambiente estão corretas.
Separar regras de negócio dos mecanismos de acesso facilita a organização desses testes. O conteúdo sobre arquitetura hexagonal e separação das regras de negócio aprofunda essa decisão arquitetural.
Testes de interface e end-to-end: cubra as jornadas essenciais
Testes de interface e testes end-to-end não são sinônimos. Um componente pode ser renderizado com dados controlados para verificar mensagens de erro, navegação pelo teclado ou estados de carregamento. Isso não exige percorrer todo o sistema.
Já um teste end-to-end acompanha uma jornada através de várias camadas. No formulário de orçamento, ele pode abrir a página, preencher os campos, enviar a solicitação e confirmar o resultado persistido no ambiente de testes.
A verificação final precisa corresponder ao risco. Observar apenas uma mensagem de sucesso não demonstra que o pedido foi salvo. Se a persistência é essencial, inclua uma evidência desse resultado. Se o e-mail estiver simulado, registre esse limite e mantenha uma verificação específica para a comunicação.
Escolha poucas jornadas com consequências importantes
Priorize fluxos cuja interrupção comprometa receita, acesso ou atendimento. Exemplos incluem solicitar orçamento, autenticar um usuário e concluir uma compra. As combinações detalhadas de regras podem ficar em testes menores, enquanto a jornada confirma a colaboração entre as camadas.
Para reduzir instabilidade, use seletores estáveis, preferencialmente associados a papéis e nomes acessíveis, e dados independentes por execução. Espere por condições observáveis, como uma resposta ou a exibição de um elemento, em vez de inserir pausas fixas.
Regressão visual e acessibilidade complementam a validação funcional. Uma comparação visual pode revelar mudanças inesperadas no layout; verificações automatizadas de acessibilidade identificam parte dos problemas e precisam ser complementadas por avaliação manual conforme o contexto. Os erros comuns de acessibilidade em interfaces web ajudam a orientar essa revisão.
Como equilibrar os níveis sem adotar percentuais fixos
Comece pela pergunta: qual é o menor escopo capaz de detectar esta falha com confiança? Uma fórmula incorreta pode ser verificada isoladamente. Uma restrição de banco exige integração. Um botão que não aciona o envio precisa de uma verificação na interface.
Para priorizar, considere o impacto da falha, sua probabilidade, a frequência de alterações e o esforço para executar e manter o teste. O histórico de incidentes ajuda a identificar pontos que merecem proteção adicional.
| Funcionalidade | Risco | Verificações adequadas |
|---|---|---|
| Orçamento | Calcular um valor incorreto ou perder uma solicitação | Unitários para cálculos; integração para persistência; jornada para o envio pelo formulário |
| Login | Conceder acesso indevido ou impedir acesso válido | Unitários para regras isoláveis; integração para autenticação e permissões; jornada para entrada e acesso à área protegida |
| Pagamento | Confirmar um pedido incorretamente ou processar um evento duas vezes | Unitários para regras de valor e transições; integração para eventos e persistência; jornada crítica no ambiente de testes apropriado |
A tabela apresenta uma distribuição possível. O desenho concreto depende da arquitetura. Um sistema com muitas integrações pode precisar de maior esforço na camada intermediária. Uma interface com interações complexas pode justificar mais testes de componentes.
Em um site institucional, o formulário de contato pode concentrar boa parte do risco operacional. Em um e-commerce, estoque, pagamento e confirmação de pedidos ampliam o conjunto de verificações necessárias.
Evite repetir todas as combinações em todos os níveis. Teste os limites de desconto isoladamente, a persistência na integração e uma seleção representativa de jornadas completas. Acrescente sobreposição quando ela proteger um risco específico que os demais testes não cobrem.
Como executar a pirâmide de testes no fluxo de entrega
A automação de testes precisa entregar resultados no momento em que a equipe consegue agir sobre eles. Organize a execução conforme duração, dependências e importância para a mudança.
- Durante o desenvolvimento: execute testes unitários e de componentes relacionados ao trabalho para descobrir erros rapidamente.
- Na revisão da alteração: rode as verificações rápidas e os testes de integração relevantes em ambiente controlado.
- Antes da publicação: execute as jornadas críticas que precisam bloquear a entrega quando falham.
- Em execuções complementares: avalie conjuntos mais demorados, combinações adicionais de navegadores e outras verificações conforme os riscos do projeto.
Um pipeline para um site empresarial pode validar regras e componentes na abertura de uma alteração, verificar API e banco em seguida e testar o formulário completo em homologação antes da publicação. Se o envio de pedidos falhar, a entrega deve aguardar investigação.
Dados e ambientes precisam ser reproduzíveis. Cada execução deve criar ou reservar seus próprios registros, controlar configurações necessárias e evitar interferência entre testes paralelos.
Preserve evidências úteis: logs, capturas de tela e rastros de execução podem ajudar a localizar a falha. Evite registrar credenciais e dados pessoais desnecessários nesses artefatos.
Defina também quem acompanha as falhas. Um teste intermitente precisa de investigação e correção; desativá-lo temporariamente exige responsável e prazo para recuperar a proteção.
Erros comuns: cobertura como meta, excesso de mocks e testes instáveis
Cobertura de código mostra quais trechos foram exercitados durante os testes. Ela ajuda a encontrar lacunas, mas não demonstra que as verificações conseguem detectar resultados incorretos.
Imagine uma suíte que executa todas as linhas do formulário, simula a gravação e verifica apenas a mensagem de sucesso. Ela pode apresentar cobertura elevada e continuar sem detectar uma incompatibilidade real com o banco.
Uma suíte que verifica regras, persistência e envio pelo navegador protege comportamentos diferentes. Ainda terá limites, mas eles ficam mais claros quando o escopo de cada teste é explícito.
- Mocks excessivos: confronte os comportamentos simulados com testes de integração ou contrato nos pontos relevantes.
- Dependência de ordem: faça cada teste preparar seus próprios dados e funcionar individualmente.
- Dados compartilhados: isole registros e recursos para evitar conflitos entre execuções.
- Pausas fixas: substitua esperas arbitrárias por condições verificáveis e limites de tempo adequados.
- Repetição automática sem investigação: use novas execuções como evidência de diagnóstico, sem tratar o desaparecimento da falha como solução.
Acompanhe duração da suíte, frequência de falhas intermitentes, tempo para diagnosticar problemas e defeitos que chegam à produção. Esses sinais ajudam a avaliar a utilidade da estratégia de testes.
Revise também testes que perderam sua finalidade. Quando uma regra muda ou uma funcionalidade deixa de existir, manter verificações antigas pode gerar trabalho sem proteger um comportamento relevante.
Por onde começar em um site ou sistema que já está em produção
Comece por uma funcionalidade importante e avance gradualmente. Levante incidentes anteriores, tarefas mais usadas e operações que afetam captação de contatos, vendas ou atendimento.
Em um site empresarial de Recife, o formulário que recebe oportunidades comerciais pode ser uma boa primeira escolha. O plano inicial pode seguir esta sequência:
- Defina o resultado esperado: uma solicitação válida deve ser registrada e disponibilizada ao atendimento pelo fluxo previsto.
- Proteja as regras: teste campos, validações e cálculos no menor escopo viável.
- Verifique a persistência: confirme que a API grava corretamente e trata entradas inválidas.
- Automatize a jornada essencial: envie o formulário pelo navegador e observe uma evidência do resultado.
- Inclua as verificações na entrega: estabeleça quais falhas impedem a publicação e quem as investiga.
Ao corrigir um defeito, acrescente um teste de regressão capaz de reproduzi-lo e verificar o comportamento esperado. Escolha o escopo pelo tipo de falha: um erro na consulta ao banco precisa de uma verificação que exercite essa consulta.
Em código legado, talvez seja necessário criar pontos de separação antes de isolar regras. Faça isso em passos pequenos, apoiados por testes do comportamento existente quando viável. Evite condicionar toda a estratégia a uma reescrita ampla.
Reavalie a distribuição quando surgirem novas integrações, mudanças de arquitetura ou incidentes. A pirâmide de testes deve acompanhar os riscos do produto e a capacidade da equipe de manter as verificações confiáveis.
Seu site precisa evoluir com mais confiança nas atualizações? Entre em contato com a Codephix para conversar sobre criação, manutenção e evolução de sites em Recife, considerando as funcionalidades essenciais para o seu negócio.

