SuperAPI AI 工具集

rust-unit-testing

测试与质量

查看项目

更新于 10-15 20:32

技能介绍

用途:为 Rust 项目提供单元测试与集成测试的实践规范,核心是测试行为与不变量,而非私有实现细节,优先确定性、表驱动测试,避免脆弱测试套件。

主要能力与范围:使用 cargo test 覆盖单元、文档与集成测试;用 #[cfg(test)] 在同文件或 crate 内放置测试模块;用 tests/ 目录针对 crate 公共 API 做集成测试;用 tokio::test 测试异步 handler 与服务;通过 traits + fakes 隔离数据库、时钟、HTTP 客户端。仅在项目已依赖时使用 pretty_assertions、rstest、mockall 或 proptest,不无必要引入 mock 框架,多数场景手写 fake 即可。

优先覆盖:领域规则与策略(授权、归属)、边界解析与校验(Result、错误码)、类型本应阻止的非法状态与变更、已发生的回归(bug 转测试)、暴露 Router/app() 时的关键 HTTP handler。

布局:单元测试靠近代码,可访问 pub(crate);集成测试仅用 pub API,作为独立 crate 编译;文档测试用于应持续编译的公开示例。测试命名采用 主体_行为_条件 或清晰的 snake_case 短语,每个测试一个主要行为,优先 assert_eq!/assert_ne!/assert!/matches!,#[should_panic] 仅用于有意的断言 panic,不用于领域错误(Result)。表驱动测试中用例相互独立,断言消息带用例名。

异步:使用项目运行时(如 #[tokio::test]),避免 sleep,等待条件或使用同步 fake;并发测试优先用 channel/barrier 而非脆弱计时。

隔离:在边界定义 trait(如 TodoRepo、Clock、EmailSender),测试注入内存 fake;不要 mock 被测系统本身,只 mock 外部依赖;临时文件用 tempfile::TempDir 并在 drop 时清理;注入 Clock 而非散落 Utc::now()。

Axum/HTTP:当应用暴露 fn app(state) -> Router 时,用 tower::ServiceExt::oneshot 发请求,覆盖状态码与相关响应体(401、403、404、校验失败),不只测 happy path;测试数据库需隔离(SQLite、容器或 repo fake),不共享脏状态。

断言与错误:尽量用 PartialEq 比较;错误用 matches! 或比较 to_string();setup 中避免无上下文 unwrap,必要时用 expect("fixture ...");不要用 let _ = 吞掉 Result。

稳定性与 CI:避免真实网络、真实时钟、非确定性 hashmap 顺序;随机性固定种子;在改动范围运行 cargo test,CI 中运行 cargo test(适用时加 --workspace);Cargo 并行通常可行,存在全局状态时用 mutex 隔离,最后手段才用 --test-threads=1。

反模式:只测琐碎 getter/setter、未经审查的巨大快照、级联 unwrap 导致失败难读、用 sleep 等待异步、为覆盖率而非风险测试、在测试中复制生产逻辑。

与其他技能衔接:语言与工具链 rust、惯用法与 Clippy 见 rust-best-practices、handler 与 Router 见 axum、生产加固见 rust-axum-production。

完成标准:改动风险用例被 cargo test 覆盖;命名可读、断言清晰;边界使用 fake、无明显 flakiness;适用时用项目运行时与 Router 测试异步/HTTP;CI 或本地命令在触及范围通过。