SuperAPI AI Directory

tdd-red-green-refactor

Testing & quality

View repository

Updated 10-16 16:28

About this skill

One-line summary

The TDD cycle: write a failing test (red), write the minimum code to pass it (green), refactor while staying green. Repeat one tiny step at a time. The discipline is in the order and the minimum — both are easy to skip.

When to use this skill

  • Building new behavior in code where you can articulate the desired outcome as a test.
  • Bug fixing — write the regression test first (see tdd-regression-test), then fix.
  • Designing an API from the consumer's side — the first test forces you to consider what calling code wants.
  • Working in a codebase with a healthy test suite where TDD adds little friction.

When NOT to use this skill

  • Pure exploration / spike work where you don't yet know the shape of what you're building. Spike first, then test-drive the rewrite.
  • Throwaway scripts, one-shot utilities, or rapid prototyping that won't be maintained.
  • UI tweaks where the cycle of "write a test, change a pixel, see the test pass" is more pain than benefit.
  • Codebases with no existing test infrastructure where setting up the harness for one feature is disproportionate. Add tests; don't pretend you're doing TDD if you can't.

Core content

Red — write a failing test. Write a small test for behavior that doesn't exist yet (or behavior you're about to add to). Run it. Confirm it fails for the right reason — compile error or assertion failure on the expected line, not some random NullPointerException three layers deep.

Green — make the test pass, minimum required. Write just enough production code to flip the test green. Minimum is load-bearing — type whatever sins are necessary in the moment (return "hardcoded" is fine). The minimum is the cheapest signal that the test is correctly wired.

Refactor — clean up while staying green. With a passing test net, restructure the code. Extract methods, rename variables, remove duplication. Run the test after each small change. If it goes red, your refactor was wrong; undo and try smaller.

Why the order matters.

  • Red first forces you to write a test that fails. If you write production code first, you may not actually need the test you write later.
  • Minimum green is the loop's discipline. Without it, you over-engineer; the loop stops being tight.
  • Refactor with the net is when design improves. Without the test, you fear changing code. With it, you can experiment.

Cycle length. A complete cycle should take minutes, not hours. If a cycle takes longer than ~30 minutes, the test was too big — reach for tdd-child-test.

TDD is not "writing tests". Tests-after is testing. Tests-first is design. The order changes how the code emerges; both produce tests but only one drives design.

Decision heuristics

  • Run tests every cycle step. Don't batch test runs — fast feedback is the point.
  • The first test you write for a new feature should be small and run quickly. Big or slow first tests kill the cycle.
  • Refactor only on green. Refactoring on red is "changing code while broken" — no longer TDD.
  • If you find yourself writing production code before the test, the test is going to be biased toward what you already wrote. Stop and rewind.

Anti-patterns

  • Tests written after the code. Often called "TDD" by people who haven't actually done TDD. Doesn't drive design.
  • Big tests covering large surfaces. Slow, hard to make green, low information when they fail.
  • Refactoring on red. "I'm fixing the design and also the test will be green when I'm done." Conflates two activities; both go wrong.
  • Skipping the minimum-green step. Going from red straight to a "real" implementation. Often introduces complexity the test doesn't actually require.
  • TDD as religion. Insisting on TDD for code that doesn't benefit (one-shot scripts, exploratory spikes). The discipline costs are real; pay them where they help.

See also

  • tdd-identify — when stuck inside the cycle, route to the right technique.
  • tdd-fake-it, tdd-obvious-implementation, tdd-triangulate — three ways to do the "green" step.
  • tdd-child-test, tdd-one-step-test — when the red test is too big or you can't pick.
  • tdd-anti-patterns — the smells that mean TDD has gone wrong.
  • Superpowers' superpowers:test-driven-development — workflow-level trigger.

References

  • Kent Beck, Test-Driven Development By Example (Addison-Wesley, 2002) — the canonical reference. Part I (Money example) walks through dozens of red-green-refactor cycles.
  • Beck's "TDD by Example" talks (frequently delivered) — distilled versions of the same material.