Skip to content
Skills Library
Programming · Building & coding

test-driven-development

/test-driven-development

Implement a feature or bugfix test-first using the red-green-refactor cycle. Write a failing test, watch it fail, write the minimal code to pass, then clean up. Works in any language or test runner. Use when building new behaviour or fixing a bug and you want the test to actually prove the code works.

Repository
dotclaude ↗
Licence
MIT
Last repository change
25.10.2026

Assessment and security

100/ 100Class: good
Format25 / 25
Frontmatter with name and description, valid name, description up to 1,024 characters, name matching the folder.
Discoverability25 / 25
Description explains when to use the skill, has a reasonable length and uses third person.
Content35 / 35
At least 150 words and at most 500 lines, headings, step lists, examples or code.
Hygiene15 / 15
No placeholders such as TODO, no Windows paths, with a licence.
Riskno signals detected in the scan
Files in this package
1
Scripts
0
HTML comments
0
URLs in SKILL.md
1
Deprecation

No signals detected. Repository changed on 25.10.2026, without references to retired models or APIs.

Licence

MIT, open: use and modify while retaining author attribution.

What it does and when to use it

Implement a feature or bugfix test-first using the red-green-refactor cycle. Write a failing test, watch it fail, write the minimal code to pass, then clean up. Works in any language or test runner. Use when building new behaviour or fixing a bug and you want the test to actually prove the code works.

Original author description

Implement a feature or bugfix test-first using the red-green-refactor cycle. Write a failing test, watch it fail, write the minimal code to pass, then clean up. Works in any language or test runner. Use when building new behaviour or fixing a bug and you want the test to actually prove the code works.

How it works

  1. The one rule
  2. Where the test goes: seams
  3. The cycle: red → green → refactor
  4. Why the order is the whole point
  5. Bugfix flavour
  6. Red flags: stop and restart test-first
  7. Quick checklist before calling it done
  8. Attribution
Original SKILL.md headings · 82 lines, 1,109 words
SKILL.md preview
---
name: test-driven-development
description: Implement a feature or bugfix test-first using the red-green-refactor cycle. Write a failing test, watch it fail, write the minimal code to pass, then clean up. Works in any language or test runner. Use when building new behaviour or fixing a bug and you want the test to actually prove the code works.
---

Write the test before the code, watch it fail, then write only enough code to make it pass. The point of seeing it fail first is simple: a test you never watched fail might be testing nothing. Tests written after the fact pass immediately, and a test that has only ever passed proves nothing about whether it would catch the bug.

## The one rule

**No production code without a failing test that demands it.** If you wrote the implementation first, the honest move is to delete it and start from the test: not keep it "as reference" and reconstruct it, which is just testing-after wearing a costume. Implement fresh from what the test asks for.

Exceptions worth asking the user about: throwaway prototypes, generated code, pure config. Everything else (features, bugfixes, behaviour changes) goes test-first. The thought "I'll skip TDD just this once" is the rationalisation this skill exists to catch.

## Where the test goes: seams

A **seam** is the public boundary you test at: the interface where behaviour is observable without reaching inside. Tests live at seams, never against internals: code behind the seam can be rewritten entirely and the tests shouldn't care. The tell that you've tested inside the seam is a test that breaks on a refactor even though behaviour didn't change.

You can't test everything, so decide the seams before writing any test: name the public interface under test and, when the choice isn't obvious, confirm it with the user ("what's the public interface here, and which paths matter most?"). Agreed seams put the testing effort on critical paths and complex logic instead of spraying assertions over every private helper.

## The cycle: red → green → refactor

### Red: write one failing test

Write a single test for one behaviour, with a name that describes that behaviour. Exercise the real code, not a mock of it: a test that asserts a mock was called tests the mock, not your logic. Mock only what you genuinely can't run (network, clock, filesystem) and only when unavoidable.

Good: `test('retries a failed operation three times before giving up')`, clear name, one behaviour, real code path.
Avoid: `test('retry works')` driving a pre-scripted mock, vague, and it verifies the mock's script rather than the implementation.

Expected values come from an independent source of truth (a known-good literal, a worked example, the spec), never recomputed the way the code computes them. `expect(add(a, b)).toBe(a + b)` passes by construction and can never disagree with the code; it is a tautology wearing a test's clothes. Same for a hand-derived snapshot built with the same reasoning as the implementation.

### Verify red: watch it fail, for the right reason

Run the test. This step is not optional. Confirm it *fails* (not errors out on a typo or import), and that it fails because the behaviour is missing: the assertion you expect, not "function not defined" hiding a different problem. If it passes, you're testing something that already exists; fix the test. If it errors, fix the error and re-run until it fails cleanly.

### Green: minimal code to pass

Write the simplest thing that makes the test pass. No extra options, no configurability nobody asked for, no "while I'm here" features. Resist designing for imagined future needs: the next test will pull the design forward when it's actually needed.

### Verify green: watch it pass

Run it again. Confirm this test passes, every other test still passes, and the output is clean (no new warnings or stray logs). If your test fails, fix the code, not the test. If a *different* test broke, fix that now.

### Refactor: clean up while green

Only once green: remove duplication, improve names, extract helpers. Keep the tests passing the whole time and don't add new behaviour here, new behaviour means a new red test.

Then repeat for the next behaviour.

## Why the order is the whole point

Tests written after the code are shaped by the code: you test what you happened to build, verify the edge cases you happened to remember, and never watch the test catch anything. Tests written first force you to state what the code *should* do and to discover edge cases before they're buried in an implementation. "Thirty minutes of tests afterward" gets you coverage but throws away the proof that the tests work.

If a test is hard to write, listen to it, hard to test usually means hard to use, or too tightly coupled. That's design feedback, not a reason to skip the test.

## Bugfix flavour

A bug is a missing test. Write a test that reproduces the bug and fails, then fix the code until it passes. Now the fix is proven and the regression can't silently come back. Never fix a bug without first having a test that fails because of it.

## Red flags: stop and restart test-first

- Production code exists with no test that failed first.
- The test passed the very first time you ran it.
- You can't explain why the test failed.
- "I'll add tests at the end."
- "I already tested it by hand."
- "Keep the code as reference and write tests around it."
- "I've spent hours on this, deleting it is wasteful." (Sunk cost, untrusted code is the liability, not the deleted time.)
- "TDD is dogmatic, I'm being pragmatic." (Test-first *is* the pragmatic path; the alternative is debugging in production.)
- Writing all the tests first, then all the implementation. That's horizontal slicing: bulk tests verify *imagined* behaviour and commit you to a test structure before the implementation has taught you anything. Work in vertical slices (one test, one implementation, repeat) each test a tracer bullet shaped by what the last cycle revealed.
- An assertion that mirrors the implementation's own arithmetic or a snapshot derived the same way the code derives it (see the tautology note under Red).

## Quick checklist before calling it done

- Every new function or behaviour has a test.
- You watched each test fail before implementing it, and it failed for the expected reason.
- The implementation is the minimum that passes.
- All tests pass and the output is clean.
- Tests run real code; mocks appear only where unavoidable.
- Edge cases and error paths are covered.

Can't tick every box? You drifted off TDD: go back to the last green point and restart test-first from there.

## Attribution

Adapted from the `test-driven-development` entry of [superpowers](https://github.com/obra/superpowers) by Jesse Vincent (MIT). The structure and the core rules are theirs; the wording, the examples, and the integration with this registry's other items are this repository's.

Versions

RepositoryScoreLicence
This page · khaledsaeed18/dotclaude100MIT
GanyuanRan/Aegis100MIT
lucasouzadev/agent-kit-skill100MIT
zeative/satgas100AGPL-3.0
nikospavlopoulos/devops-mutant-powers100MIT
JohnStrunk/CommonCast100LGPL
Sanit-mann/The-Insectoids100MIT
mastro993/fstack100MIT
jelvodev/yaap100MIT

Identical content appears in 1 other GitHub folders. We show one copy with the highest score.

Database snapshot: 13.11.2026 · package version a5afabcb32d6 (SHA-256 digest of the entire package)

Downloads in the last 30 days: 0 · ranking

Report a problem with this skill: harmful content, incorrect descriptions or an author’s removal request.

Similar skills

  • 90ring:test-driven-development
    Enforcing the RED-GREEN-REFACTOR loop: write one failing test and watch it fail, write minimal code to pass, then refactor green. Use when starting implementation of a new feature or bugfix, or writing any new production code. Requires pasted failure output as proof of RED; code…
  • 100red-green-refactor
    Guides the red-green-refactor TDD workflow: write a failing test first, implement the minimum code to make it pass, then refactor while keeping tests green. Use when a user asks to practice TDD, write tests first, follow red-green-refactor, do test-driven development, write…
  • 100tdd
    Enforces test-driven development: write failing test, write minimal code to pass, refactor. Mandatory for all implementation work. Use when writing any production code, implementing features, fixing bugs, refactoring, or when the user says "write code", "implement", "fix this",…
  • 100test-driven-development-quick
    Runs the red-green-refactor loop with a compact set of rules: one failing test, the minimal code to pass it, cleanup under green. Use for routine test-first work on a single behavior or a small bug fix, and when the request mentions TDD, test-first, red-green-refactor, or…
  • 100tdd
    Red-green-refactor procedure: write the failing test first, show it fail, write the minimum code, refactor on green. Use for any bug fix or new behavior in code that has or could have tests, including 'fix this bug', 'add a function', 'use TDD' and 'write the test first'.
  • 100tdd
    Test-driven development: red-green-refactor, one test per cycle. Use when the task asks to build a feature, fix a bug or change behaviour, before you write the code.

Feedback and reports

Your message goes to Bartosz Sokoliński. An email address is needed only for a reply. See the privacy policy.