Test Driven Development (TDD)
Goal
Write code that is proven to work the moment it is written, preventing regression and ensuring high design quality.
When to Use
- Implementing complex business logic.
- Fixing a bug (write the failing test first).
- Creating utility functions or data transformations.
- NOT strictly required for boilerplate/scaffolding, but recommended.
Instructions
1. Red (Write a Failing Test)
Write a test that defines the expected behavior.
- It must fail. If it passes, your test is broken or the feature already exists.
- Compilation Error: Even not compiling counts as "Red".
def test_calculate_total():
# We haven't written the function yet
result = calculate_total([10, 20])
assert result == 30
2. Green (Make it Pass)
Write the minimum amount of code to pass the test.
- Do not optimize.
- Do not worry about clean code yet.
- Hardcoding values is acceptable if it passes the specific test (you will generalize in the next step).
def calculate_total(items):
return sum(items)
3. Refactor (Clean Up)
Improve the code while keeping the test green.
- Rename variables.
- Extract functions.
- Optimize performance.
- Remove duplication.
4. Repeat
Add the next test case (e.g., test_calculate_total_empty_list) and repeat.
Constraints
✅ Do
- DO: Run tests after every change.
- DO: Write only enough code to pass the current failing test.
- DO: Treat test code with the same quality standards as production code.
❌ Don't
- DON'T: Write the implementation first, then "backfill" tests.
- DON'T: Skip the "Red" phase. You must verify the test can fail.
- DON'T: Refactor while the test is failing. Get to Green first.
Output Format
- Test files (
tests/unit/test_xyz.py). - Implementation files.
Dependencies
backend/testing-flask/SKILL.mdORfrontend/testing-frontend/SKILL.md