MÓDULO 02 · CONCEITO 02 DE 8

Pirâmide, Troféu & Honeycomb

Estratégias de teste comparadas — qual cabe no seu sistema, e por que a resposta não é universal.

Tempo de leitura ~21 min Pré-requisito TDD em profundidade Próximo Test doubles

Pergunte para dez engenheiros sêniores qual deveria ser a proporção entre testes unitários, integração e end-to-end e você terá pelo menos quatro respostas convictas e mutuamente incompatíveis. A "pirâmide de testes" de Mike Cohn virou doutrina nos anos 2000; recebeu rebatidas modernas como o "Trophy" de Kent C. Dodds e o "Honeycomb" da Spotify. Cada uma reflete um contexto diferente e prioriza trade-offs distintos. Saber quando aplicar qual é parte do que separa engenheiros experientes — eles não escolhem por lealdade ao guru, escolhem por análise do sistema diante deles.

Este conceito não vai resolver o debate por você — é genuinamente contextual. Vai dar três coisas: o vocabulário preciso de cada estratégia, os argumentos a favor e contra de cada uma, e um conjunto de heurísticas para decidir o mix do seu sistema específico. Com isso, quando alguém na sua equipe disser "deveríamos ter mais testes de integração", você consegue ter a conversa em vez de ficar preso em "mas a pirâmide diz...".

O que cada nível de teste é

Antes do debate de proporções, alinhar os termos. Em conversas técnicas, "teste de integração" significa coisas diferentes em times diferentes. As definições que vou usar:

Há nomes alternativos circulando: "teste de componente", "teste de sistema", "teste de aceitação". A taxonomia de Toby Clemson em Testing Strategies in a Microservice Architecture tem mais níveis. Para fins desta discussão, os quatro acima cobrem o essencial.

A Pirâmide — Mike Cohn, 2009

Mike Cohn publicou em Succeeding with Agile a imagem icônica: uma pirâmide com três camadas. Base larga: testes unitários, muitos. Meio: testes de serviço/integração, médio. Topo estreito: UI/E2E, poucos. A intuição é que testes mais baixos são rápidos, baratos, determinísticos; mais altos são lentos, caros, frágeis.

Os argumentos a favor são bons:

A pirâmide envelheceu razoavelmente bem. Para sistemas onde a maior parte da complexidade está em domínio (cálculos, regras de negócio, transformações), ela cabe — porque essa complexidade pode ser testada isoladamente, e o restante do sistema é "casca fina" que poucos E2E cobrem bem.

O Troféu — Kent C. Dodds, 2018

Kent C. Dodds, no contexto de aplicações React/web, propôs uma forma diferente: um troféu. Camadas, em proporção: pequeno topo "estática" (linter, type checking), camada de unidade, maior camada de integração, e finalmente E2E reduzido. A inversão sutil: a maior fatia vai para integração, não unidade.

O argumento dele:

O troféu nasce do contexto de aplicações de UI rica onde a integração entre componentes é onde a complexidade vive. Para esse contexto, faz muito sentido. A questão é se generaliza para outros — e a resposta depende.

O Honeycomb — Spotify (e outros)

A Spotify popularizou (em blog post de 2018) uma terceira forma para arquitetura de microsserviços: o honeycomb. A ideia central é que em microsserviços, a unidade natural de teste é o serviço, não a classe interna. Você testa cada serviço como uma "caixa preta" via sua API, com fakes para serviços vizinhos.

Proporção do honeycomb: poucos testes unitários focados (apenas onde lógica é genuinamente complexa), grande quantidade de testes de integração no nível do serviço, e E2E mínimos cobrindo fluxos críticos. O argumento é parecido com o do Troféu: minimizar mocks, testar com colaboração real onde possível.

Onde Honeycomb brilha:

Os argumentos contrários

Cada estratégia tem críticos articulados. Vale ouvi-los.

Contra a Pirâmide pura

Críticas válidas:

Contra o Troféu/Honeycomb (a inversão)

Críticas válidas:

O critério unificador — qual o objetivo?

Dave Farley, em Modern Software Engineering, formula o problema de forma esclarecedora: testes existem para responder duas perguntas diferentes, e estratégias diferentes respondem cada uma melhor.

  1. "O design está certo?": TDD com testes unitários responde. O ciclo curto, o feedback imediato, a pressão sobre fronteiras — tudo isso é design, não verificação.
  2. "O sistema funciona?": testes de integração e E2E respondem. Eles verificam que o que foi construído faz o que deveria, ponta a ponta.

Ambos importam. Um sistema com bom design mas integrações quebradas é útil para quem? Um sistema que "funciona" mas é impossível de manter é sustentável por quanto tempo? A resposta saudável é: tenha as duas camadas, ajuste a proporção pelo seu sistema.

Heurísticas para decidir o mix

Em vez de aderir a uma estratégia específica, use as seguintes perguntas para calibrar a proporção do seu sistema:

Onde está a complexidade?

Se a complexidade do seu sistema está principalmente em:

Quanto custa cada categoria?

Não custo de escrever — custo de manter e rodar. Times com CI lento descobrem rápido que mil testes de integração viram fila de horas. Times com infra automática para containers descobrem que integração é barata. Mensure no seu contexto.

Quão estável é a interface?

Componentes com interface estável (núcleo de domínio que muda pouco) sustentam testes unitários por muito tempo sem manutenção. Componentes com interface volátil (UI em produto novo) sofrem com testes acoplados a interface — tanto unitário quanto E2E. Aqui pode ser o caso de menos testes em geral até a interface estabilizar.

Quão crítico é o caminho?

Caminhos que se quebrarem custam reputação ou receita merecem proteção multi-camada. Login, checkout, pagamento — tenha unitário e integração e E2E. Caminhos secundários podem ter cobertura menor.

Em que ponto você está?

Sistema novo em exploração: pouco teste, muitos spikes. Sistema maduro em produção: cobertura sólida em todas as camadas. Migração: testes antes da migração que verificam comportamento atual (characterization tests), depois refactor. Cada fase pede mix diferente.

O modelo de Spotify — categorias por velocidade

Uma decomposição prática que muitos times usam (independente da forma geométrica preferida) é separar testes por velocidade de feedback:

Essa classificação por velocidade frequentemente é mais útil do que classificação por escopo. Mesmo um teste "unitário" pode ser slow se tem setup elaborado; um "integração" bem-feito pode ser rápido. O que importa para o time é quanto tempo do feedback você gasta para que tipo de garantia.

heurística do sênior

Não obsessione sobre a forma geométrica. Concentre em três métricas operacionais: o ciclo TDD funciona (segundos)? O CI dá veredito antes do contexto se perder (10-15 min)? Bugs em produção são pegos por algum nível de teste antes de chegarem lá? Se sim aos três, sua estratégia está adequada — independente de chamarmos pirâmide, troféu ou outra coisa.

Os três níveis no projeto deste módulo

O sistema de pedidos do projeto vai ter as quatro categorias:

A proporção provavelmente vai parecer com troféu mais que pirâmide pura — porque o domínio é simples e as integrações são onde o valor está. Mas é decisão tomada com critério, não dogma.

Como praticar

  1. Auditoria do seu projeto atual. Categorize todos os testes por velocidade e escopo. Veja a forma. Ela faz sentido para o tipo de sistema?
  2. Mensure tempo de cada categoria. Quanto leva o ciclo TDD local? Quanto leva o CI por PR? Quanto leva o deploy? Identifique gargalos. Frequentemente um único teste lento estraga uma suíte inteira.
  3. Discuta forma com o time. Não há resposta correta absoluta. Mas a discussão revela suposições escondidas — alguns acham "deveria ter mais E2E", outros "menos". A conversa em si clarifica o que cada um valoriza.

Referências para aprofundar

  1. livro Succeeding with Agile — Mike Cohn (2009). A fonte da pirâmide. Capítulo 16. O livro inteiro vale para entender o contexto Agile dos anos 2000 que motivou a forma.
  2. livro Modern Software Engineering — Dave Farley (2021). Capítulos sobre testes como prática de engenharia. Farley argumenta pelo critério "design vs verificação".
  3. livro Building Microservices (2nd ed.) — Sam Newman (2021). Capítulo sobre testes em microsserviços. Discute trade-offs de cada estratégia em distribuído.
  4. artigo Write Tests. Not Too Many. Mostly Integration. — Kent C. Dodds (2018). kentcdodds.com/blog/write-tests — o post que cunhou o "trophy". Provocação útil contra dogmatismo da pirâmide.
  5. artigo Testing Strategies in a Microservice Architecture — Toby Clemson (Martin Fowler bliki). martinfowler.com/articles/microservice-testing/ — taxonomia rica e didática. Cobre os trade-offs com profundidade.
  6. artigo Testing of Microservices — André Schaffer (Spotify, 2018). labs.spotify.com — o post que apresentou o honeycomb. Específico da Spotify mas conceitualmente útil.
  7. artigo The Practical Test Pyramid — Ham Vocke (Martin Fowler bliki). martinfowler.com/articles/practical-test-pyramid.html — visão moderna da pirâmide com pragmatismo. Bom complemento ao Cohn original.
  8. artigo Just Say No to More End-to-End Tests — Mike Wacker (Google Testing Blog, 2015). testing.googleblog.com — Google argumenta pela pirâmide com dados. Influente nos times grandes.
  9. docs Cypress Testing Strategy. docs.cypress.io/guides/references/best-practices — perspectiva de quem faz E2E moderno. Útil mesmo se não usar Cypress.
  10. docs Testcontainers. testcontainers.com — biblioteca multi-linguagem para integração com containers. Mudou o que é "viável" em integração.
  11. vídeo Test Pyramid in Practice — Henry Coles (devoxx). YouTube. Coles é autor de PIT mutation testing. Sua perspectiva combina teoria e prática.
  12. vídeo Test Sizes — Google Testing Tech. YouTube. Visão do Google: testes categorizados por tamanho (small, medium, large) em vez de tipo. Outra forma de pensar a hierarquia.