rtk-tdd
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.
By rtk-ai · 1,637 installs
npx skills add rtk-ai/rtk --skill rtk-tdd
Source repository · Upstream listing
Rust TDD Workflow
Three Laws of TDD
1. Do NOT write production code without a failing test
2. Write only enough test to fail (including compilation failure)
3. 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
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
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 to Result first, 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
All 3 must pass. No exceptions. No [allow(...)] without documented justification.