7 min leitura • Guide 744 of 877
Desenvolvimento Orientado a Testes com GitScrum
TDD não é apenas sobre testes - é sobre design e confiança. O GitScrum suporta workflows de TDD com rastreamento de tarefas que reflete o ciclo red-green-refactor.
Fundamentos do TDD
O Ciclo TDD
CICLO RED-GREEN-REFACTOR:
┌─────────────────────────────────────────────────────────────┐
│ │
│ ┌────────────┐ │
│ │ RED │ ← Escreva teste que falha │
│ │ (Teste │ "O que o código deve fazer?" │
│ │ Falha) │ │
│ └─────┬──────┘ │
│ │ │
│ ▼ │
│ ┌────────────┐ │
│ │ GREEN │ ← Escreva código mínimo para passar│
│ │ (Teste │ "Faça funcionar, nada mais" │
│ │ Passa) │ │
│ └─────┬──────┘ │
│ │ │
│ ▼ │
│ ┌────────────┐ │
│ │ REFACTOR │ ← Melhore sem quebrar testes │
│ │ (Código │ "Faça ficar limpo" │
│ │ Limpo) │ │
│ └─────┬──────┘ │
│ │ │
│ └──────────→ Repita │
│ │
│ TEMPO DO CICLO: Minutos, não horas │
│ │
│ REGRAS CHAVE: │
│ • Nunca escreva código sem um teste falhando │
│ • Escreva o código mínimo para passar │
│ • Refatore só quando testes estiverem verdes │
│ • Rode testes frequentemente │
└─────────────────────────────────────────────────────────────┘
Benefícios do TDD
POR QUE TDD FUNCIONA:
┌─────────────────────────────────────────────────────────────┐
│ │
│ BENEFÍCIOS DE DESIGN: │
│ • Força pensar na interface primeiro │
│ • Leva a código modular e testável │
│ • Captura problemas de design cedo │
│ • Resulta em designs mais simples │
│ │
│ BENEFÍCIOS DE QUALIDADE: │
│ • Bugs capturados imediatamente │
│ • Alta cobertura de teste naturalmente │
│ • Proteção contra regressão │
│ • Confiança para refatorar │
│ │
│ BENEFÍCIOS DE PRODUTIVIDADE: │
│ • Menos tempo debugando │
│ • Feedback mais rápido │
│ • Documentação através de testes │
│ • Onboarding mais fácil │
│ │
│ BENEFÍCIOS PSICOLÓGICOS: │
│ • Pequenas vitórias (testes verdes) │
│ • Confiança no código │
│ • Seguro para mudar │
│ • Progresso claro │
│ │
│ SEM TDD: │
│ Escreve código → Testa depois → Acha bugs → Debug → Fix │
│ │
│ COM TDD: │
│ Escreve teste → Escreve código → Passa → Refatora → Pronto│
└─────────────────────────────────────────────────────────────┘
TDD na Prática
Exemplo de Workflow
EXEMPLO TDD - ADICIONAR AO CARRINHO:
┌─────────────────────────────────────────────────────────────┐
│ │
│ STORY: "Como usuário, posso adicionar itens ao carrinho" │
│ │
│ CICLO TDD 1: │
│ │
│ RED: Escreva teste │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ test('adiciona item ao carrinho vazio', () => { ││
│ │ const carrinho = new Carrinho(); ││
│ │ carrinho.adicionar(item); ││
│ │ expect(carrinho.items.length).toBe(1); ││
│ │ }); ││
│ │ // Resultado: ❌ FALHA - Carrinho não existe ││
│ └─────────────────────────────────────────────────────────┘│
│ │
│ GREEN: Escreva código mínimo │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ class Carrinho { ││
│ │ items = []; ││
│ │ adicionar(item) { this.items.push(item); } ││
│ │ } ││
│ │ // Resultado: ✅ PASSA ││
│ └─────────────────────────────────────────────────────────┘│
│ │
│ REFACTOR: (Nada para refatorar ainda) │
│ │
│ ─────────────────────────────────────────────────────────── │
│ │
│ CICLO TDD 2: │
│ │
│ RED: Próximo comportamento │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ test('não adiciona item duplicado', () => { ││
│ │ const carrinho = new Carrinho(); ││
│ │ carrinho.adicionar(item); ││
│ │ carrinho.adicionar(item); ││
│ │ expect(carrinho.items.length).toBe(1); ││
│ │ expect(carrinho.items[0].quantidade).toBe(2); ││
│ │ }); ││
│ │ // Resultado: ❌ FALHA ││
│ └─────────────────────────────────────────────────────────┘│
│ │
│ GREEN: Adicione lógica │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ adicionar(item) { ││
│ │ const existente = this.items.find( ││
│ │ i => i.id === item.id ││
│ │ ); ││
│ │ if (existente) { ││
│ │ existente.quantidade++; ││
│ │ } else { ││
│ │ this.items.push({...item, quantidade: 1}); ││
│ │ } ││
│ │ } ││
│ │ // Resultado: ✅ PASSA ││
│ └─────────────────────────────────────────────────────────┘│
│ │
│ Continue ciclo para cada comportamento... │
└─────────────────────────────────────────────────────────────┘
TDD no GitScrum
Rastreando Trabalho TDD
TDD NO GITSCRUM:
┌─────────────────────────────────────────────────────────────┐
│ │
│ STORY COM TDD: │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ US-123: Calcular total do pedido com desconto ││
│ │ ││
│ │ CRITÉRIOS DE ACEITE: ││
│ │ ☐ Soma preços dos itens ││
│ │ ☐ Aplica desconto percentual ││
│ │ ☐ Não permite desconto > 50% ││
│ │ ☐ Arredonda para 2 casas decimais ││
│ │ ││
│ │ SUBTAREFAS: ││
│ │ ☐ [TDD] Teste: soma preços ││
│ │ ☐ [TDD] Teste: aplica desconto ││
│ │ ☐ [TDD] Teste: limite de desconto ││
│ │ ☐ [TDD] Teste: arredondamento ││
│ │ ☐ Refatoração final ││
│ │ ││
│ │ DEFINIÇÃO DE DONE: ││
│ │ ☐ Todos os testes passando ││
│ │ ☐ Cobertura > 90% ││
│ │ ☐ Code review aprovado ││
│ └─────────────────────────────────────────────────────────┘│
│ │
│ CADA SUBTAREFA TDD: │
│ 1. Escreva teste (RED) │
│ 2. Faça passar (GREEN) │
│ 3. Refatore se necessário │
│ 4. Marque como concluída │
│ 5. Próxima subtarefa │
└─────────────────────────────────────────────────────────────┘
Quando Usar TDD
Quando TDD Brilha
TDD É IDEAL PARA:
┌─────────────────────────────────────────────────────────────┐
│ │
│ ✅ USE TDD: │
│ │
│ LÓGICA DE NEGÓCIO: │
│ • Cálculos financeiros │
│ • Regras de validação │
│ • State machines │
│ • Algoritmos │
│ │
│ CÓDIGO CRÍTICO: │
│ • Autenticação/Autorização │
│ • Processamento de pagamento │
│ • Transformação de dados │
│ │
│ CÓDIGO QUE VAI MUDAR: │
│ • Features com evolução esperada │
│ • Código que outros vão modificar │
│ │
│ ─────────────────────────────────────────────────────────── │
│ │
│ ⚠️ TDD MENOS VALIOSO: │
│ │
│ • Protótipos descartáveis │
│ • Exploração de UI/layout │
│ • Spikes de pesquisa │
│ • Código gerado automaticamente │
│ • Scripts únicos │
│ │
│ NOTA: Mesmo nesses casos, adicione testes depois │
│ se o código vai para produção │
└─────────────────────────────────────────────────────────────┘
Dicas Práticas
Para Começar com TDD
COMEÇANDO COM TDD:
┌─────────────────────────────────────────────────────────────┐
│ │
│ PASSO 1: COMECE PEQUENO │
│ • Escolha uma função isolada │
│ • Pratique o ciclo básico │
│ • Não tente TDD em tudo de uma vez │
│ │
│ PASSO 2: ESCREVA O TESTE MAIS SIMPLES │
│ • Comece com happy path │
│ • Um comportamento por teste │
│ • Nome descreve o que testa │
│ │
│ PASSO 3: CÓDIGO MÍNIMO PARA PASSAR │
│ • Resista a escrever código "extra" │
│ • Pode parecer "feio" inicialmente │
│ • Refatore depois │
│ │
│ PASSO 4: REFATORE COM CONFIANÇA │
│ • Testes protegem você │
│ • Melhore nomes, extraia funções │
│ • Rode testes após cada mudança │
│ │
│ ─────────────────────────────────────────────────────────── │
│ │
│ ERROS COMUNS: │
│ │
│ ❌ Escrever implementação antes do teste │
│ ❌ Múltiplos comportamentos por teste │
│ ❌ Testes que dependem de ordem │
│ ❌ Testar detalhes de implementação │
│ ❌ Pular refatoração │
└─────────────────────────────────────────────────────────────┘