Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Generate implementation code that passes existing unit tests. Use when the user provides test files (Python pytest/unittest, Java JUnit/TestNG) and asks Claude to implement the code to make those tests pass. Supports full TDD workflow - analyzing tests, generating implementation, running tests, debugging failures, and iterating until all tests pass.
.claude/skills/arabelatso-test-driven-generation/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | 82% | 0% |
| case-18 | ✗→✓ | ▲ Improved | 77% | 0% |
| case-08 | ✓→✗ | ▼ Worse | 67% | 0% |
| case-03 | ✓→✓ | = Same ✓ | 34% | 0% |
| case-04 | ✓→✓ | = Same ✓ | 37% | 0% |
Generate implementation code that satisfies existing unit tests through an iterative test-driven development workflow.
Read and understand the provided test file(s):
Create implementation code that should satisfy the tests:
For Python:
For Java:
Execute the test suite to verify the implementation:
Python:
bashpytest <test_file>.py -v # or python -m unittest <test_file>.py -v
Java:
bashmvn test # or gradle test # or for single test file javac <TestFile>.java && java org.junit.runner.JUnitCore <TestFile>
If tests fail, analyze the failure output:
Fix the implementation based on failure analysis:
User provides test_calculator.py:
pythonimport pytest from calculator import Calculator def test_add(): calc = Calculator() assert calc.add(2, 3) == 5 assert calc.add(-1, 1) == 0 def test_divide(): calc = Calculator() assert calc.divide(10, 2) == 5 with pytest.raises(ValueError): calc.divide(10, 0)
Step 1: Analyze - need Calculator class with add() and divide() methods, divide should raise ValueError on zero
Step 2: Generate calculator.py:
pythonclass Calculator: def add(self, a, b): return a + b def divide(self, a, b): if b == 0: raise ValueError("Cannot divide by zero") return a / b
Step 3: Run pytest test_calculator.py -v
Step 4: If failure occurs, read error and identify issue
Step 5: Fix and re-run until passing
setUp/tearDown or fixtures that provide context@pytest.mark.parametrize for multiple test cases@Before/@After setup methods@ParameterizedTest annotations| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 33,678 | 8,256 | -75% | 1 | 1 | 0% | 2,609 | 1,178 | -55% | 0 | 0 | — |
case-02 | fail→fail | 46,994 | 5,950 | -87% | 1 | 1 | 0% | 296 | 1,212 | +309% | 0 | 0 | — |
case-03 | pass→pass | 15,874 | 28,164 | +77% | 1 | 1 | 0% | 2,553 | 3,427 | +34% | 0 | 0 | — |
case-04 | pass→pass | 39,691 | 12,632 | -68% | 1 | 1 | 0% | 2,175 | 2,974 | +37% | 0 | 0 | — |
case-05 | pass→pass | 11,505 | 24,126 | +110% | 1 | 1 | 0% | 1,753 | 2,760 | +57% | 0 | 0 | — |
case-06 | pass→pass | 6,062 | 8,445 | +39% | 1 | 1 | 0% | 816 | 1,438 | +76% | 0 | 0 | — |
case-07 | fail→pass | 6,420 | 4,522 | -30% | 1 | 1 | 0% | 810 | 1,476 | +82% | 0 | 0 | — |
case-08 | pass→fail | 15,165 | 16,313 | +8% | 1 | 1 | 0% | 2,212 | 3,686 | +67% | 0 | 0 | — |
case-09 | pass→pass | 24,640 | 12,787 | -48% | 1 | 1 | 0% | 1,953 | 3,072 | +57% | 0 | 0 | — |
case-10 | pass→pass | 11,191 | 10,385 | -7% | 1 | 1 | 0% | 1,810 | 2,639 | +46% | 0 | 0 | — |
case-11 | pass→pass | 12,138 | 17,663 | +46% | 1 | 1 | 0% | 1,890 | 3,070 | +62% | 0 | 0 | — |
case-12 | pass→pass | 12,096 | 7,800 | -36% | 1 | 1 | 0% | 2,110 | 2,442 | +16% | 0 | 0 | — |
case-13 | pass→pass | 13,043 | 13,189 | +1% | 1 | 1 | 0% | 2,126 | 3,231 | +52% | 0 | 0 | — |
case-14 | pass→pass | 18,351 | 11,483 | -37% | 1 | 1 | 0% | 2,463 | 2,345 | -5% | 0 | 0 | — |
case-15 | pass→pass | 7,118 | 5,078 | -29% | 1 | 1 | 0% | 1,061 | 1,587 | +50% | 0 | 0 | — |
case-16 | pass→pass | 4,118 | 3,920 | -5% | 1 | 1 | 0% | 570 | 1,500 | +163% | 0 | 0 | — |
case-17 | pass→pass | 61,514 | 24,539 | -60% | 1 | 1 | 0% | 1,568 | 2,003 | +28% | 0 | 0 | — |
case-18 | fail→pass | 7,126 | 5,378 | -25% | 1 | 1 | 0% | 832 | 1,475 | +77% | 0 | 0 | — |
case-19 | pass→pass | 22,813 | 17,790 | -22% | 1 | 1 | 0% | 2,271 | 3,927 | +73% | 0 | 0 | — |
case-20 | fail→fail | 19,244 | 13,736 | -29% | 1 | 1 | 0% | 3,922 | 3,551 | -9% | 0 | 0 | — |
case-21 | fail→fail | 3,698 | 4,377 | +18% | 1 | 1 | 0% | 410 | 1,491 | +264% | 0 | 0 | — |
case-22 | pass→pass | 10,974 | 18,316 | +67% | 1 | 1 | 0% | 1,916 | 2,574 | +34% | 0 | 0 | — |
case-23 | pass→pass | 16,265 | 10,281 | -37% | 1 | 1 | 0% | 2,624 | 2,797 | +7% | 0 | 0 | — |
case-24 | pass→pass | 15,054 | 10,785 | -28% | 1 | 1 | 0% | 1,932 | 2,516 | +30% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 24 cases were attempted, and 22 counted toward the lift figure. The other 2 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of 0 percentage points is the difference between those two pass rates over the 22 comparable cases. 2 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.