Estratégia de testes
Pirâmide
| Camada | Onde | Comando | Papel |
|---|---|---|---|
| Unitários | src/**/*.spec.ts | npm run test | Serviços, mappers, DTOs, JWT strategy, utils |
| Cobertura | coverage/ (lcov) | npm run test:cov | CI faz upload do artefact; Sonar lê coverage/lcov.info |
| e2e | test/*.e2e-spec.ts | npm run test:e2e | HTTP real (Jest test/jest-e2e.json) |
| Mutação | Stryker | npm run test:mutation | Qualidade dos unitários; CI continue-on-error |
| Contrato vivo | Swagger + Postman | manual / local | Não substitui Jest |
Não há suite de carga no repositório. Presença multi-pod não está coberta (mapa in-memory).
Configuração
- Jest unitário:
jest.config.json—rootDir: src,setupFiles: test-setup.ts, mapper@/. - Cobertura: inclui
srcexcepto*.spec.ts,*.module.ts,main.ts,test-setup.ts. - e2e:
test/jest-e2e.json. - Stryker:
stryker.conf.json— thresholds high 80 / low 60 / break 50; mutatesrc/**/*.tsexcepto specs,main, modules. - Sonar:
sonar-project.properties.
O que testar por tipo de mudança
| Mudança | Mínimo esperado |
|---|---|
| Novo endpoint | DTO spec + serviço; documentar no catálogo; Swagger annotations |
Auth / @Public / tenant | spec do guard/strategy e caso e2e 401/403 |
| Mapper / query SQL | spec com fixtures; 409 CNPJ / 404 tenant |
| Operacional (datas, APPR) | spec do range e agregações |
| Só docs | sem teste de código |
Como correr
npm run test
npm run test:watch
npm run test:cov
npm run test:e2e
npm run test:debug
npm run test:mutation
CI (.github/workflows/ci.yml): test:cov é obrigatório; mutação e Sonar não falham o pipeline (continue-on-error no Sonar/Stryker).
Cobertura alvo
Não há gate rígido no Jest. Prática da casa:
- Código novo em
application/epresentation/dtodeve entrar com spec. - Não baixar cobertura nas pastas que já têm testes (company, auth-login, password-reset, external-apis).
- Stryker break 50 é o chão; não o trate como objectivo.
Dados e isolamento
- Specs não devem apontar a BD real de staging. Use mocks de repositório / TestingModule.
- e2e que precisem de Postgres devem usar env de teste (
.env.testestá no.gitignore) — não commits de connection strings. - Payloads: e-mails e CNPJs fictícios.