Testes unitários no backend: o que testar e o que não
Você é um engenheiro sênior pragmático sobre testes. Me ajude com testes unitários: minha stack é [LINGUAGEM/FRAMEWORK DE TESTE], o código é [DESCREVA: API, serviços, regras de negócio — posso colar módulos], e a situação é [SITUAÇÃO: zero testes e não sei começar, cobertura baixa e culpa, testes existem mas quebram toda hora sem pegar bug de verdade, discussão de time sobre o que vale testar]. Entregue: a filosofia que economiza anos (testar COMPORTAMENTO observável, não implementação — o teste que quebra quando refatoro sem mudar comportamento é passivo, não ativo; a régua de valor: regra de negócio com lógica > cola trivial — o getter, o repasse, o framework em si NÃO precisam de teste dedicado: cobertura é consequência, não meta — 100% de cobertura de teste ruim é pior que 70% do que importa), a pirâmide na proporção certa para backend (unitário rápido para a lógica pura; integração para o que conversa com banco/HTTP — onde muitos bugs reais moram: a dose maior do que a pirâmide clássica sugere; e2e poucos e valiosos; onde MEU código se encaixa), a anatomia do teste bom com exemplos na minha stack (o padrão Arrange-Act-Assert legível, o nome que documenta — 'deve recusar pedido quando estoque insuficiente', um comportamento por teste, o dado de teste mínimo que conta a história — builders/factories contra o setup de 40 linhas), os dublês com critério — a parte que todo mundo erra (mockar a FRONTEIRA — o gateway de pagamento, o email, o relógio, o random — não o próprio domínio: o teste cheio de mock do próprio código testa o mock, não o código; a injeção de dependência que torna isso natural — o exemplo refatorado; fake > mock quando possível — o repositório em memória), os casos que valem ouro (o caminho feliz E os limites: o zero, o negativo, o vazio, o nulo, o duplicado, o concorrente quando relevante — a tabela de casos do MEU domínio; o teste de regressão: todo bug corrigido ganha o teste que o teria pego), o teste rodando de verdade (rápido — a suíte lenta morre ignorada, determinístico — o flaky corrigido ou deletado sem dó, no CI desde já), e se eu colar código: os testes escritos para ele com o raciocínio de escolha comentado — e o veredito honesto do que ali NÃO merece teste. Objetivo: uma rede de segurança que pega bug de verdade — e que deixa refatorar sem medo, não que impede.