Help us improve
Share bugs, ideas, or general feedback.
From leandrocfe-skills
Implements test-driven development with the red-green-refactor cycle using vertical slices. Builds integration-style tests through public interfaces and avoids horizontal slicing anti-patterns.
npx claudepluginhub leandrocfe/skillsHow this skill is triggered — by the user, by Claude, or both
Slash command
/leandrocfe-skills:tddThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
**Princípio central**: Testes devem verificar comportamento através de interfaces públicas, não detalhes de implementação. O código pode mudar inteiramente; os testes não devem.
Guides test-driven development with a red-green-refactor loop, vertical slicing (one test at a time), and integration-style tests that verify behavior through public interfaces.
Guides test-driven development with red-green-refactor loop, emphasizing integration-style tests and vertical slicing.
Share bugs, ideas, or general feedback.
Princípio central: Testes devem verificar comportamento através de interfaces públicas, não detalhes de implementação. O código pode mudar inteiramente; os testes não devem.
Bons testes são integration-style: exercitam caminhos de código reais através de APIs públicas. Descrevem o que o sistema faz, não como. Um bom teste lê como uma especificação — "user can checkout with valid cart" te diz exatamente qual capacidade existe. Esses testes sobrevivem a refactors porque não se importam com estrutura interna.
Testes ruins são acoplados à implementação. Mockam colaboradores internos, testam métodos privados ou verificam por meios externos (tipo fazer query direto no database em vez de usar a interface). Sinal de alerta: seu teste quebra quando você refatora, mas o comportamento não mudou. Se você renomeia uma função interna e testes quebram, esses testes estavam testando implementação, não comportamento.
Veja tests.md para exemplos e mocking.md para diretrizes de mocking.
NÃO escreva todos os testes primeiro, depois toda a implementação. Isso é "horizontal slicing" — tratar RED como "escrever todos os testes" e GREEN como "escrever todo o código".
Isso produz testes ruins:
Abordagem correta: Vertical slices via tracer bullets. Um teste → uma implementação → repete. Cada teste responde ao que você aprendeu do ciclo anterior. Como você acabou de escrever o código, sabe exatamente qual comportamento importa e como verificar.
ERRADO (horizontal):
RED: test1, test2, test3, test4, test5
GREEN: impl1, impl2, impl3, impl4, impl5
CERTO (vertical):
RED→GREEN: test1→impl1
RED→GREEN: test2→impl2
RED→GREEN: test3→impl3
...
Ao explorar a codebase, use o glossário de domínio do projeto para que nomes de testes e vocabulário de interface combinem com a linguagem do projeto, e respeite ADRs na área que está tocando.
Antes de escrever qualquer código:
Pergunte: "Como deve ser a interface pública? Quais comportamentos são mais importantes de testar?"
Você não consegue testar tudo. Confirme com o usuário exatamente quais comportamentos mais importam. Foque o esforço de teste em paths críticos e lógica complexa, não em todo edge case possível.
Escreva UM teste que confirma UMA coisa sobre o sistema:
RED: Escrever teste para o primeiro comportamento → teste falha
GREEN: Escrever código mínimo para passar → teste passa
Este é seu tracer bullet — prova que o caminho funciona end-to-end.
Para cada comportamento restante:
RED: Escrever próximo teste → falha
GREEN: Código mínimo para passar → passa
Regras:
Depois de todos os testes passarem, procure por candidatos a refactor:
Nunca refatore enquanto RED. Chegue a GREEN primeiro.
[ ] Teste descreve comportamento, não implementação
[ ] Teste usa só interface pública
[ ] Teste sobreviveria a refactor interno
[ ] Código é mínimo para este teste
[ ] Sem features especulativas adicionados