cargo test / fmt / clippy / bench
更新时间:2026-09-20。Rust 把测试、格式化、静态检查都内建进 cargo,无需另搭框架。依赖与构建开关见 Cargo.toml,工具链/组件安装见 rustup。
一、单元测试:和代码放一起
pub fn add(a: i32, b: i32) -> i32 { a + b }
#[cfg(test)]
mod tests {
use super::*; // 把父模块私有项引进来,可测私有函数
#[test]
fn it_adds() {
assert_eq!(add(2, 3), 5);
}
#[test]
#[should_panic(expected = "overflow")]
fn it_panics() { panic!("overflow"); }
}#[cfg(test)]让测试模块只在测试时编译,不进正式产物;use super::*后可以测私有函数,这是 Rust 测试的便利之处;- 断言:
assert!、assert_eq!、assert_ne!,失败信息可用assert!(x, "ctx={x}")。
二、集成测试:tests/ 目录
mycrate/
├── src/lib.rs
└── tests/
└── integration.rs # 只作为外部使用者,只能访问 pub APItests/ 下每个文件编译成独立 crate,只能用公开 API,适合验证对外行为;单元测试测内部实现,集测测契约。
三、跑测试的常用姿势
cargo test # 编译并跑全部单测+集测+文档测试
cargo test it_adds # 按名字过滤,跑匹配的测试
cargo test -- --nocapture # 让 println! 输出显示出来(-- 后是测试 harness 参数)
cargo test -- --test-threads=1 # 串行执行(涉及共享资源/顺序敏感时)
cargo test --release # 用 release 优化编译测试
cargo test --workspace # 整个 workspace返回 Result 的测试也被支持:fn f() -> Result<(), String> { Ok(()) },配合 ? 写起来更顺。
四、cargo fmt:统一代码风格
rustup component add rustfmt # 首次需装组件
cargo fmt # 直接改文件
cargo fmt --check # 只检查不改,给 CI 用(不合规返回非 0)rustfmt 消除团队关于缩进、行宽、import 排序的口水战;CI 里跑 --check 强制风格一致。项目可用 rustfmt.toml 调(如 max_width = 100)。
五、cargo clippy:官方静态检查
rustup component add clippy
cargo clippy # 输出 warning/建议
cargo clippy -- -D warnings # 把所有警告当错误,CI 强制清零Clippy 不只是风格,它抓大量真实坑与更地道的写法:needless_range_loop(可用迭代器别用下标)、clippy::clone_on_copy(对 Copy 类型多余 clone)、map_entry(先 contains_key 再 insert 应改用 entry API,见 HashMap/entry)、可能的算术溢出、低效的 or(fun()) 提前求值等。CI 建议固定 cargo clippy --all-targets -- -D warnings。
六、cargo bench 与 Criterion
内置 benchmark harness 仍不稳定(部分版本需 nightly),实践多用 Criterion:
[dev-dependencies]
criterion = { version = "0.5", features = ["html_reports"] }
[[bench]]
name = "my_bench"
harness = false// benches/my_bench.rs
use criterion::{black_box, criterion_group, criterion_main, Criterion};
fn bench_add(c: &mut Criterion) {
c.bench_function("add", |b| b.iter(|| black_box(2) + black_box(3)));
}
criterion_group!(benches, bench_add);
criterion_main!(benches);cargo bench # Criterion 会多次采样,给出均值/中位数/方差并检测回归black_box 阻止编译器把计算优化掉。所有性能结论都必须在 --release/bench 下得出——debug 构建默认不开优化,数字毫无参考价值,这点和 Cargo 编译模型/release 强调的一致。
总结
Rust 把质量工具链内建在 cargo:#[test] 加 #[cfg(test)] mod tests 写可访问私有函数的单测,tests/ 目录写只能用公开 API 的集成测试,cargo test 支持按名过滤、--nocapture、单线程与 release;cargo fmt/--check 统一风格,cargo clippy -- -D warnings 用官方 lint 同时抓地道写法和真实 bug(如 entry API、多余 clone);基准用 Criterion 多次采样并以 black_box 防优化,任何性能数字都必须在 release 构建下测量。