Melhores Práticas de Teste
Regras que mantêm as suítes de teste da API Node rápidas, confiáveis e focadas no comportamento observável.
Como Usar Esta Lista
- Aplique ao adicionar o primeiro teste a um novo serviço.
- Revise durante PRs que adicionam mocks ou infraestrutura de integração.
- Aplique via CI (requer
npm test, job de integração separado).
A - Design de Teste
- Teste o comportamento, não a implementação privada. Afirme o status HTTP, o JSON retornado e os efeitos colaterais - não a ordem de chamada interna.
- Siga a pirâmide: muitas unidades, menos integrações, raras E2E. A maioria dos testes conclui em milissegundos.
- Nomeie testes como especificações.
retorna 409 quando a fatura já está pagaé melhor queteste1. - Um foco principal de asserção por teste. Múltiplas asserções OK ao verificar um resultado de comportamento.
- Casos orientados por tabela para variações de entrada. Cubra casos extremos sem testes de copiar e colar.
B - Estrutura de HTTP e Aplicativo
- Exporte
createApp()sem auto-listen. Supertest e Fastifyinjectprecisam de aplicativos em processo. - Cubra caminhos de erro: manipuladores 400, 401, 404, 409, 500. Suítes apenas de caminho feliz perdem regressões.
- Use Supertest ou Fastify inject, não portas aleatórias. Evite
EADDRINUSEe CI instável. - Não acesse URLs de produção em testes. Apenas staging ou em processo.
- Congele o tempo ao testar a lógica de TTL/expiração.
vi.setSystemTimeou interface de clock injetada.
C - Dados e Isolamento
- Isole o banco de dados por job ou suíte de CI. Testcontainers ou schema dedicado; nunca compartilhe o banco de dados de desenvolvimento.
- Trunque ou reverta entre testes de integração. Evite falhas dependentes da ordem.
- Use factories/builders para entidades de teste. Configuração legível sem 50 linhas de fixtures inline.
- Alimente dados mínimos por teste. Grandes fixtures compartilhados escondem qual campo causou a falha.
- Execute migrações no banco de dados de teste como no de produção. Capture diferenças de SQL cedo.
D - Ferramentas e CI
- Entrada única
npm test; divida unidade vs integração quando necessário.test:integrationpode exigir Docker. - Prefira
node:testou Vitest para código novo; planeje a saída do Jest em brownfield. Evite três runners. - Execute testes em cada PR após
typecheckelint. Ordem de falha rápida no pipeline. - Não mescle testes instáveis. Quarentena com ticket do proprietário e expiração, ou corrija imediatamente.
- Testes de contrato para dependências HTTP entre serviços. Pact ou diff de schema antes do deploy.
E - Carga e Lançamento
- k6/Artillery smoke no staging antes de lançamentos importantes. Limiares p95 e de taxa de erro definidos.
- Teste de carga em caminhos de escrita com estratégia de limpeza. Prefixo idempotente ou tenant dedicado.
- Meça a cobertura; não adore 100%. Módulos de domínio críticos visados; código gerado excluído.
- Teste o middleware de autenticação com tokens realistas. Não
auth desabilitado em testeglobalmente, a menos que seja uma unidade isolada. - Documente como executar testes de integração localmente. Pré-requisito Docker no README.
FAQs
Por que comportamento em vez de implementação?
Testes de implementação quebram ao refatorar sem mudança de comportamento. Asserções HTTP/domínio sobrevivem a reescritas internas.
Quão isolado o banco de dados deve ser?
Por container de job de CI é o ideal. Mínimo: nome de banco de dados separado e truncar entre suítes.
Quando os mocks são apropriados?
APIs de terceiros externas e infraestrutura lenta em testes unitários. Prefira Postgres real em integração para correção de SQL.
Os testes E2E devem ficar no repositório do serviço?
Jornadas críticas sim (smoke de deploy). E2E completo entre produtos pode ficar em um repositório separado - mantenha os testes de integração do serviço aqui.
Como evitar testes Supertest instáveis?
Sem singletons mutáveis compartilhados; aguarde todas as requisições; reinicie módulos ou use createApp() novo por teste.
Padrão node:test ou Vitest?
node:test para lógica pura sem dependências; Vitest quando mocks/watch/cobertura dominam o fluxo de trabalho.
Quantos testes de contrato?
Um pacto por par consumidor-provedor cobrindo os endpoints realmente chamados - não a superfície completa da API.
Teste de carga em cada PR?
Não - noturno ou pré-lançamento. Smoke curto opcional em branches de lançamento.
Estratégia de teste NestJS?
Teste unitário de serviços com repositórios mockados; e2e Supertest para controllers; Testcontainers para integração de banco de dados.
E os testes de snapshot?
Com moderação para formas de erro JSON estáveis; prefira asserções de campo explícitas para APIs.
Relacionados
- Noções Básicas de Teste - introdução à pirâmide
- Supertest e Integração HTTP - HTTP em processo
- Testcontainers - Postgres/Redis real
Versões da Stack: Esta página foi escrita para Node.js 24.18.0 (LTS Ativo), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 e NestJS 11.