--- name: test-driven-development description: Write the test first, watch it fail, write minimal code to pass version: 3.2.0 category: testing author: Jesse Vincent license: MIT source: https://github.com/obra/superpowers-skills/tree/main/skills/testing/test-driven-development progressive_disclosure: entry_point: summary: "Enforce test-first development with strict RED/GREEN/REFACTOR cycle. Never write implementation before failing test." when_to_use: "When implementing any feature or bugfix, before writing implementation code. Always for new features, bug fixes, refactoring, and behavior changes." quick_start: "1. Write failing test 2. Watch it fail (verify) 3. Write minimal code to pass 4. Watch it pass (verify) 5. Refactor if needed 6. Repeat" references: - workflow.md - examples.md - philosophy.md - anti-patterns.md - integration.md context_limit: 800 tags: - tdd - testing - red-green-refactor - test-first effort: high --- # Test-Driven Development (TDD) ## Overview Write the test first. Watch it fail. Write minimal code to pass. **Core principle:** If you didn't watch the test fail, you don't know if it tests the right thing. This skill enforces strict test-first development following the RED/GREEN/REFACTOR cycle. Violating the letter of the rules is violating the spirit of the rules. ## When to Use This Skill **Always:** - New features - Bug fixes - Refactoring - Behavior changes **Exceptions (ask human partner):** - Throwaway prototypes - Generated code - Configuration files Thinking "skip TDD just this once"? Stop. That's rationalization. ## The Iron Law ``` NO PRODUCTION CODE WITHOUT A FAILING TEST FIRST ``` Write code before the test? Delete it. Start over. **No exceptions:** - Don't keep it as "reference" - Don't "adapt" it while writing tests - Delete means delete ## Core Principles 1. **RED**: Write a failing test first 2. **GREEN**: Write minimal code to make test pass 3. **REFACTOR**: Improve code while keeping tests green 4. **NEVER**: Write implementation before tests ## Quick Start ### The RED/GREEN/REFACTOR Cycle ``` RED → Verify RED → GREEN → Verify GREEN → REFACTOR → Repeat ``` 1. **RED**: Write one minimal test showing desired behavior 2. **Verify RED**: Run test, confirm it fails for right reason 3. **GREEN**: Write simplest code to pass test 4. **Verify GREEN**: Run test, confirm it passes 5. **REFACTOR**: Clean up while keeping tests green 6. **Repeat**: Next test for next feature ## Cycle Details **RED**: Write one minimal test (one behavior, clear name, real code) **Verify RED**: MANDATORY - watch it fail for right reason **GREEN**: Write simplest code to pass (no extras) **Verify GREEN**: MANDATORY - watch it pass, all tests pass **REFACTOR**: Clean up while keeping tests green (optional) ## Navigation For detailed information: - **[Workflow](references/workflow.md)**: Complete RED/GREEN/REFACTOR workflow with detailed examples - **[Examples](references/examples.md)**: Real-world TDD scenarios with step-by-step walkthroughs - **[Philosophy](references/philosophy.md)**: Why order matters and why tests-after don't work - **[Anti-patterns](references/anti-patterns.md)**: Common mistakes, rationalizations, and red flags - **[Integration](references/integration.md)**: Using TDD with debugging and other skills ## Key Reminders - ALWAYS write the test BEFORE implementation - Make each test fail FIRST to verify it's testing something - Keep implementation minimal - just enough to pass tests - Refactor only when tests are green - One cycle at a time - small steps - If test passes immediately, it's not testing new behavior ## Red Flags - STOP and Start Over If you catch yourself: - Writing code before test - Test passes immediately - Can't explain why test failed - "I'll test after" - "Keep as reference" - "Already spent X hours, deleting is wasteful" - "Tests after achieve the same purpose" **ALL of these mean: Delete code. Start over with TDD.** ## Why Order Matters Tests-after pass immediately (proves nothing), test-first fail then pass (proves it works). See [Philosophy](references/philosophy.md) for detailed explanation. ## Integration with Other Skills - **systematic-debugging**: Create failing test in Phase 4 (bug reproduction) - **verification-before-completion**: Verify tests exist and watched them fail - **defense-in-depth**: Add validation tests after implementing feature ## Real-World Impact From TDD practice: - Test-first: 95%+ first-time correctness - Test-after: 40% first-time correctness - TDD time: 25-45 minutes per feature (including tests) - Non-TDD time: 15 minutes coding + 60-120 minutes debugging **TDD is pragmatic** - finds bugs before commit, prevents regressions, documents behavior, enables refactoring.