本技能用于指导 Rust 项目的测试结构与测试生态工具选型。
用途:为 Rust 测试提供布局约定、断言写法、运行器配置、mock 决策规则,以及属性测试、快照测试、基准测试和异步测试的做法。原则是优先真实实现和手写 fake,而非重度 mock;测试关注公开契约与可观察结果,而非内部调用顺序。
测试布局:单元测试放在被测代码同文件的 #[cfg(test)] mod tests 中,用 use super::*; 引入父模块,可测试私有项。集成测试放在与 src/ 同级的顶层 tests/ 目录,Cargo 将每个文件编译为独立 crate,只能通过 use my_crate::... 访问公开 API。共享辅助代码放 tests/common/mod.rs 并用 mod common; 导入。二进制 crate 应让 main.rs 薄封装 lib.rs,由集成测试覆盖库 crate。doctest 写在公开项的 /// 示例中,用 # 隐藏准备行,```no_run 表示只编译不运行。
断言:布尔用 assert!,值相等用 assert_eq!/assert_ne!,必要时加消息参数。assert_matches! 自 Rust 1.96 稳定,需 use std::assert_matches::assert_matches;。比较大结构体可用 pretty_assertions 的 assert_eq/assert_ne 获得彩色差异输出。
运行器:用 cargo nextest run 运行单元与集成测试,每个测试在独立进程并行执行;它不运行 doctest,必须同时执行 cargo test --doc,两者都应纳入验证门禁。支持 -p/--workspace、--lib/--test、-E 过滤、--no-capture、--retries、--fail-fast 等选项。
Mock 决策:按 真实实现 → 内存 fake → 手写 double → mockall 逐级升级,仅在 IO 或非确定性边界使用 mockall,避免断言内部调用顺序。
属性与快照:不变量用 proptest 或 quickcheck;结构性大输出用 insta,配合 cargo insta review;基准测试放 benches/,用 criterion 并在 Cargo.toml 的 [[bench]] 设 harness = false,输入输出用 std::hint::black_box 包裹。
异步测试:用 #[tokio::test],默认 current-thread;需要并行时用 multi_thread。用 tokio::time::pause() 与 tokio::time::advance() 使计时确定化,避免真实 sleep。
限制:具体 crate 版本以资料中的日期标注为准;未提供的平台、收费等信息暂未提供。