🎞️ Slides 📝 Material ← Módulo
Módulo 2 · Ciclo Comum · IN02 Plano de Ensino

Aula 9 — Testes e Automação

Plano operacional do dia: cobrir cada camada do MVC com o tipo certo de teste — unit, supertest, banco efêmero, Husky e CI no GitHub Actions.

← Voltar ao Módulo

Identificação

Disciplina
IN02 · Desenvolvimento Web
Módulo
2 — Ciclo Comum
Aula
9 de 11
Carga horária do dia
6h (2h + 2h + 2h)
Modalidade
Presencial · Metodologia ativa
Pré-aula
Autoestudo guiado

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/it claro 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 supertest cobrindo 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-jest instalados no projeto (caso ainda não, instalar no Bloco 1).
Importante

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 — 10h00

Estudo 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 husky e lint-staged como 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 — 12h00

Encontro 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 — 14h00

Janela livre.

🛠️ Bloco 3 · Desenvolvimento do projeto

14h00 — 16h00

Janela 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 + script lint-staged).
  • Criar workflow .github/workflows/ci.yml com Postgres como service container, rodando lint + tests.
  • Abrir Merge Request chore(test): cobertura por camada + CI com evidência (badge ou screenshot do workflow verde).

Detalhamento da instrução PE (10h00 — 12h00)

10h00
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.

10h15
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.

10h30
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.

10h50
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".

11h10
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.

11h30
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?

11h45
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.

11h55
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.yml recém-escrito para validar steps, services e cache antes de abrir o MR.

Recursos e ferramentas

CategoriaRecursoUso
Slidesslides/slide-lesson-9.htmlExposição na instrução PE
Materialmaterials/lesson-9-material.htmlAutoestudo
Test runnerjest + ts-jestUnit, integration e coverage
HTTP testingsupertestTestes de controller (status, shape, redirect)
Banco efêmeropg-mem ou TestcontainersTestes de repository com isolamento
Pre-commit hookshusky + lint-stagedTravar erros antes do commit
CI.github/workflows/ci.ymlLint + 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/it claro.
  • 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 supertest cobrindo status e shape JSON.
  • CR-5Husky + lint-staged ativos no pre-commit + workflow GitHub Actions verde, tudo no MR chore(test): cobertura por camada + CI aberto até as 16h.
Critério mínimo

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 supertest continuam valendo quando as views ganharem novo visual: o contrato HTML/JSON não muda.
Para o autoestudo da aula 10

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).

Inteli Logo