研发协作
Rust 开发中实现、测试、重构或修 bug 时:用…
在 Rust 项目中实现功能、写测试、重构或修复 bug 时,按失败测试先行、最小实现通过、再重构并跑 fmt/clippy/test 门禁执行。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
Rust 开发中实现、测试、重构或修 b特定
解决思路
- 不写失败测试,就不写生产代码。
- 只写足够让测试失败(包括编译失败)的测试。
- 只写足够让失败测试通过的生产代码。
- 按 RED(测试失败)-> GREEN(最小实现通过)-> REFACTOR(清理并运行 cargo test)循环。
- 在同一个文件的 #[cfg(test)] mod tests 中写测试。
- 运行 cargo test MODULE::tests::test_name,必须 FAIL(red)。
- 在函数中实现最小代码。
- 再次运行 cargo test MODULE::tests::test_name,必须 PASS(green)。
- 如有需要则重构,并重新运行 cargo test,保持 green。
- 最终门禁运行 cargo fmt && cargo clippy --all-targets && cargo test。
- 绝不跳过第 2 步;如果测试立即通过,它没有测到任何东西。
- 每个测试都以 Arrange-Act-Assert 作为基础结构。
- 确定性值用 assert_eq! / assert! 做直接比较或布尔断言。
- 错误路径测试(非法输入)用 assert!(result.is_err())。
- 可失败函数且测试中要用 ? 运算符时,测试返回 Result<()>。
- 期望 panic(不变量、前置条件)用 #[should_panic]。
- 文件/I/O 测试且依赖文件系统时用 tempfile::NamedTempFile。
- 纯函数(str -> str)测试:输入字面量 -> 断言输出,例如 assert_eq!(truncate("hello", 3), "...")。
- 解析/过滤测试:原始字符串 -> 过滤 -> 断言 contains/not-contains,例如 assert!(filter(raw).contains("expected"))。
- 校验/安全测试:边界输入 -> 断言 bool,例如 assert!(!is_valid("../etc/passwd"))。
- 错误处理测试:坏输入 -> is_err(),例如 assert!(parse("garbage").is_err())。
- 结构体/枚举 roundtrip 测试:构造 -> 序列化 -> 反序列化 -> 相等断言,例如 assert_eq!(from_str(to_str(x)), x)。
- 测试命名使用 test_{function}_{scenario}。
- 测试命名使用 test_{function}_{input_type}。
- 命名示例:test_truncate_edge_case、test_parse_invalid_input、test_filter_empty_string。
- 提交前运行 cargo fmt --all --check。
- 提交前运行 cargo clippy --all-targets。
- 提交前运行 cargo test。
- 以上 3 个命令必须全部通过,无例外。
- 没有文档化理由,不得使用 #[allow(...)]。
适用边界 · 注意事项
- 函数调用 Command::new() 时,不要用纯 TDD 测其执行;应测试 parser,而不是执行。
- 遇到 std::process::exit() 时,不要直接用纯 TDD;先把代码重构为 Result,再测试 Result。
- 直接 I/O(SQLite、网络)不要用纯 TDD;应使用 tempfile/mock,或单独测试纯逻辑。
- Main/CLI wiring 不要用纯 TDD;由集成测试或冒烟测试覆盖。