名称: test-driven-development
描述: 统一TDD技能,支持三种输入模式——基于规范、基于任务或基于描述。使用仓库模式强制执行测试优先开发,提供属性测试指导和背压集成。
type: anthropic-skill
版本: "1.0"
一个技能覆盖所有TDD工作流。利用现有仓库模式强制执行测试优先开发。三种输入模式处理不同的切入点——规范文件、任务文件或临时描述——但核心循环始终是:红 → 绿 → 重构。
检测输入类型并遵循相应模式:
.spec.md)当输入引用包含 Given/When/Then 验收标准的 .spec.md 文件时使用。
todo!() 占位:rust
/// 规范: <spec-file> — 标准 #<N>
/// Given <给定条件>
/// When <操作>
/// Then <预期结果>
#[test]
fn <spec_name>_criterion_<N>_<slug>() {
todo!("实现: <预期结果>");
}cargo test --no-run -p <crate>编程支持: ralph_core::preflight::{extract_acceptance_criteria, extract_criteria_from_file, extract_all_criteria} 可从规范文件中解析标准。
.code-task.md)当输入引用 .code-task.md 文件或特定实现任务时使用。
用于没有规范或任务文件的临时任务。
在编写测试前,发现现有约定:
rg --files -g "crates/*/tests/*.rs"
rg -n "#\[cfg\(test\)\]" crates/
阅读目标代码附近的 2-3 个相关测试文件。模仿:
- 测试模块布局、命名和断言风格
- 夹具助手和测试工具
- tempfile、场景或测试框架的使用
仅当满足 所有 以下条件时使用 proptest:
- 函数是纯函数(无 I/O、无时间依赖、无全局变量)
- 给定输入具有确定性输出
- 输入空间复杂或存在边界情况
proptest! {
#[test]
fn round_trip(input in "[a-z0-9]{0,32}") {
let encoded = encode(input.as_str());
let decoded = decode(&encoded).expect("应该解码成功");
prop_assert_eq!(decoded, input);
}
}
没有充分理由时,不要引入 proptest 作为新依赖。
在完成事件中包含覆盖率证据:
ralph emit "build.done" "tests: pass, lint: pass, typecheck: pass, audit: pass, coverage: pass (82%)"
可行时运行 cargo tarpaulin --out Html --output-dir coverage --skip-clean。如果无法运行覆盖率测试,请说明原因并包含针对性的测试证据。
#[cfg(test)] 测试crates/<crate>/tests/crates/ralph-cli/tests/