Identificação
Resumo
A aula 9 traz garantia para tudo que foi construído nas aulas anteriores. Os alunos cobrem cada camada do MVC com o tipo de teste certo: helpers com unit puro, services com mock do repository, repositories com banco efêmero (pg-mem ou Postgres em Docker), controllers com supertest, e views EJS com smoke pelo controller.
Coverage entra como métrica (não meta). Husky + lint-staged travam erros no pre-commit. GitHub Actions roda lint + tests com Postgres como service container. A pirâmide de testes vira regra prática a partir desta aula.
Objetivos de aprendizagem
- OA-1Posicionar cada teste na camada correta da pirâmide (unit / integração / e2e).
- OA-2Aplicar AAA (Arrange/Act/Assert) com naming
describe/itclaro e legível. - OA-3Mockar o repository em testes de service usando
jest.fn(). - OA-4Configurar banco efêmero para repository (
pg-mem, Testcontainers ou Postgres descartável). - OA-5Testar controllers com
supertestcobrindo status, shape JSON e redirecionamentos. - OA-6Configurar Husky + lint-staged + GitHub Actions com Postgres como service.
Pré-requisitos
- Aulas 5–8 concluídas: o projeto já existe com camadas implementadas (controllers, services, repositories, helpers e views EJS).
- Camadas separadas em diretórios distintos (
src/controllers,src/services,src/repositories,src/helpers). - Jest e
ts-jestinstalados no projeto (caso ainda não, instalar no Bloco 1).
Aqui a equipe cobre o que ficou descoberto — o trabalho não é "escrever testes do zero", é auditar o projeto e tapar buracos camada a camada.
Cronograma do dia
📚 Bloco 1 · Autoestudo
08h00 — 10h00Estudo individual orientado pelo material da aula 9.
- Leitura completa do Material da Aula 9 (pirâmide de testes, AAA, mocks, banco efêmero, supertest, Husky, GitHub Actions).
- Auditar o projeto e listar funções e rotas sem testes agrupadas por camada (helpers, services, repositories, controllers).
- Instalar
huskyelint-stagedcomo devDependencies (npm i -D husky lint-staged). - Caderno de bordo: anotar dúvidas sobre quando mockar e quando subir banco real.
🎓 Bloco 2 · Instrução PE — Aula em metodologia ativa
10h00 — 12h00Encontro síncrono com o professor especialista. 15 minutos de daily seguidos de 1h45 de aula.
- 10h00 — 10h15 · Daily: lacunas de cobertura trazidas do autoestudo.
- 10h15 — 12h00 · Pirâmide, AAA, mock de repository, banco efêmero, supertest, coverage e CI.
🍴 Intervalo · Almoço
12h00 — 14h00Janela livre.
🛠️ Bloco 3 · Desenvolvimento do projeto
14h00 — 16h00Janela de trabalho da equipe sobre o projeto integrador.
- Subir cobertura mínima de cada camada: pelo menos 1 helper, 1 service, 1 repository e 1 controller testados.
- Ativar Husky + lint-staged no
pre-commit(npx husky init+ scriptlint-staged). - Criar workflow
.github/workflows/ci.ymlcom Postgres como service container, rodando lint + tests. - Abrir Merge Request
chore(test): cobertura por camada + CIcom evidência (badge ou screenshot do workflow verde).
Detalhamento da instrução PE (10h00 — 12h00)
10h15
DailyDaily de abertura
Cada aluno apresenta, em 1 minuto, uma camada do projeto que ainda não tem teste e o motivo do gap.
10h30
TalkPirâmide de testes + anti-padrões
Apresentação da pirâmide (muitos unit, alguns integration, poucos e2e), o anti-padrão "casquinha de sorvete" (e2e demais) e o "ampulheta" (sem integração). Como cada camada do MVC mapeia para a pirâmide.
10h50
CodingHelpers com unit puro (AAA)
Em pares: escolher um helper de formatação/validação e escrever um teste com Arrange / Act / Assert explícito, naming describe/it claro. Rodar jest --watch para ver red→green ao vivo.
11h10
CodingService com mock de repository (red→green)
Demo: testar um service usando jest.fn() para fingir o repository, isolando a regra de negócio. Os pares replicam o padrão em um service do próprio projeto e debatem quando o mock está "demais".
11h30
CodingRepository com banco efêmero
Demonstração de duas estratégias: pg-mem (in-memory rápido) e Postgres em Docker (mais fiel). Padrão BEGIN/ROLLBACK por teste para garantir isolamento. Os pares escolhem uma estratégia e escrevem 1 teste de repository.
11h45
CodingController com supertest
Em pares: importar o app Express, usar supertest para fazer request(app).post('/...').expect(201), validar status, shape JSON e redirecionamentos. Discussão: onde plugar o banco efêmero?
11h55
TalkCoverage como métrica + Husky + GitHub Actions
Coverage como métrica (não meta) — número alto sem assert significativo é teatro. Apresentação rápida do pre-commit com Husky + lint-staged e do workflow GitHub Actions com Postgres como service container.
12h00
AtivaSíntese + entrega da tarde
Cada aluno escreve "a aula 9 me ensinou que...". O professor anuncia a entrega: cobertura por camada + Husky + workflow verde no MR chore(test): cobertura por camada + CI.
Estratégias de metodologia ativa
- Dojo de testes — cada par escreve 1 teste por camada e roda no projetor, expondo o ciclo red→green em tempo real.
- Debate sobre over-mocking — após o exercício de service, a turma discute quando mockar protege e quando esconde bug real.
- Code review cruzado — equipes trocam o
ci.ymlrecém-escrito para validar steps, services e cache antes de abrir o MR.
Recursos e ferramentas
| Categoria | Recurso | Uso |
|---|---|---|
| Slides | slides/slide-lesson-9.html | Exposição na instrução PE |
| Material | materials/lesson-9-material.html | Autoestudo |
| Test runner | jest + ts-jest | Unit, integration e coverage |
| HTTP testing | supertest | Testes de controller (status, shape, redirect) |
| Banco efêmero | pg-mem ou Testcontainers | Testes de repository com isolamento |
| Pre-commit hooks | husky + lint-staged | Travar erros antes do commit |
| CI | .github/workflows/ci.yml | Lint + tests com Postgres como service |
Verificação de aprendizagem
- CR-1Pelo menos 1 helper testado com AAA explícito (Arrange/Act/Assert) e naming
describe/itclaro. - CR-2Pelo menos 1 service testado mockando o repository com
jest.fn(). - CR-3Pelo menos 1 repository testado com banco efêmero (
pg-mem, Testcontainers ou Postgres descartável) com isolamento por teste. - CR-4Pelo menos 1 controller testado com
supertestcobrindo status e shape JSON. - CR-5Husky + lint-staged ativos no pre-commit + workflow GitHub Actions verde, tudo no MR
chore(test): cobertura por camada + CIaberto até as 16h.
Aluno que sair às 16h sem pelo menos um teste por camada (helper, service, repository, controller) e sem o workflow do GitHub Actions verde está em débito técnico — o projeto não pode subir para produção sem rede de proteção mínima.
Conexão com a aula 10
Com a rede de proteção montada, a aula 10 fecha o bloco de front-end em nível profissional sem framework: CSS Variables com tematização (claro/escuro), Grid e Flexbox mobile-first, BEM, ES Modules nativos, classes, localStorage e FormData.
- A suite verde de hoje é o que permite refatorar CSS e JS do front sem medo — qualquer regressão aparece no CI antes do merge.
- Os testes de controller com
supertestcontinuam valendo quando as views ganharem novo visual: o contrato HTML/JSON não muda.
Antes das 8h do próximo dia: ler o material da aula 10, identificar 5 componentes visuais reaproveitáveis no projeto (ex.: card, badge, botão, modal, navbar) e mapear os breakpoints que o projeto vai suportar (mobile, tablet, desktop).