rtco-tdd
Implements TDD workflows for Rust to ensure code quality through rigorous testing.
Install
mkdir -p .claude/skills/rtco-tdd && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/12280" && unzip -o skill.zip -d .claude/skills/rtco-tdd && rm skill.zipInstalls to .claude/skills/rtco-tdd
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Enforces TDD (Red-Green-Refactor) for Rust development. Auto-triggers on implementation, testing, refactoring, and bug fixing tasks. Provides Rust-idiomatic testing patterns with anyhow/thiserror, cfg(test), and Arrange-Act-Assert workflow.Key capabilities
- →Write failing tests before production code
- →Implement minimum production code to pass tests
- →Refactor code while maintaining passing tests
- →Apply Arrange-Act-Assert pattern for tests
- →Use `#[cfg(test)]` for Rust test modules
How it works
The skill enforces the Red-Green-Refactor cycle for Rust development. It mandates writing a failing test, then minimal production code to make the test pass, followed by refactoring while ensuring tests remain green. It also specifies idiomatic Rust test patterns.
Inputs & outputs
When to use rtco-tdd
- →Writing test-first rust code
- →Refactoring rust modules
- →Enforcing red-green-refactor workflow
About this skill
Rust TDD Workflow
Three Laws of TDD
- Do NOT write production code without a failing test
- Write only enough test to fail (including compilation failure)
- Write only enough production code to pass the failing test
Cycle: RED (test fails) -> GREEN (minimum to pass) -> REFACTOR (cleanup, cargo test)
Red-Green-Refactor Steps
1. Write test in #[cfg(test)] mod tests of the SAME file
2. cargo test MODULE::tests::test_name -- must FAIL (red)
3. Implement the minimum in the function
4. cargo test MODULE::tests::test_name -- must PASS (green)
5. Refactor if needed, re-run cargo test (still green)
6. cargo fmt && cargo clippy --all-targets && cargo test (final gate)
Never skip step 2. If the test passes immediately, it tests nothing.
Idiomatic Rust Test Patterns
| Pattern | Usage | When |
|---|---|---|
| Arrange-Act-Assert | Base structure for every test | Always |
assert_eq! / assert! | Direct comparison / booleans | Deterministic values |
assert!(result.is_err()) | Error path testing | Invalid inputs |
Result<()> return type | Tests with ? operator | Fallible functions |
#[should_panic] | Expected panic | Invariants, preconditions |
tempfile::NamedTempFile | File/I/O tests | Filesystem-dependent code |
Patterns by Code Type
| Code Type | Test Pattern | Example |
|---|---|---|
| Pure function (str -> str) | Input literal -> assert output | assert_eq!(truncate("hello", 3), "...") |
| Parsing/filtering | Raw string -> filter -> contains/not-contains | assert!(filter(raw).contains("expected")) |
| Validation/security | Boundary inputs -> assert bool | assert!(!is_valid("../etc/passwd")) |
| Error handling | Bad input -> is_err() | assert!(parse("garbage").is_err()) |
| Struct/enum roundtrip | Construct -> serialize -> deserialize -> eq | assert_eq!(from_str(to_str(x)), x) |
Naming Convention
test_{function}_{scenario}
test_{function}_{input_type}
Examples: test_truncate_edge_case, test_parse_invalid_input, test_filter_empty_string
When NOT to Use Pure TDD
- Functions calling
Command::new()-> test the parser, not the execution std::process::exit()-> refactor toResultfirst, then test the Result- Direct I/O (SQLite, network) -> use tempfile/mock or test the pure logic separately
- Main/CLI wiring -> covered by integration/smoke tests
Pre-Commit Gate
cargo fmt --all --check
cargo clippy --all-targets
cargo test
All 3 must pass. No exceptions. No #[allow(...)] without documented justification.
When not to use it
- →When testing functions that call `Command::new()` directly, as only the parser should be tested
- →When testing `std::process::exit()`, as it should be refactored to `Result` first
- →When testing direct I/O (SQLite, network) without mocks or separate logic
Limitations
- →Requires writing only enough test to fail.
- →Requires writing only enough production code to pass the failing test.
- →Pre-commit gate requires `cargo fmt --all --check`, `cargo clippy --all-targets`, and `cargo test` to pass.
How it compares
This skill provides a structured, test-first development approach for Rust, ensuring code correctness and maintainability through a disciplined Red-Green-Refactor cycle, unlike ad-hoc testing or writing tests after implementation.
Compared to similar skills
rtco-tdd side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| rtco-tdd (this skill) | 0 | 2mo | Review | Intermediate |
| reproduce-reduce-regress | 1 | 7mo | No flags | Intermediate |
| evolve | 0 | 3mo | No flags | Advanced |
| implementing-cards | 7 | 2mo | Review | Advanced |
Try saying
Example prompts that trigger this skill in your AI assistant.
You might also like
reproduce-reduce-regress
facet-rs
Systematic workflow for debugging by reproducing bugs with real data, reducing test cases to minimal examples, and adding regression tests
evolve
yologdev
Safely modify your own source code, test changes, and manage your evolution
implementing-cards
bcollazo
Fill out the implementation of effects of different attacks, abilities, and trainer cards in this Pokemon TCG Pocket engine codebase.
rust-tests-guidelines
RediSearch
Guidelines for writing Rust tests.
write-rust-tests
RediSearch
Write Rust tests to verify correctness of Rust code.
check-rust-coverage
RediSearch
Check which Rust lines are not covered by Rust tests.