Rust 单元测试:Criterion 与 Integration Test
·
Rust 测试:Criterion 基准测试与集成测试
在 Rust 中,测试主要分为三类:
- 单元测试:测试单个模块内部功能(通常写在
src/文件中) - 集成测试:测试库的公共 API(位于
tests/目录) - 基准测试:测量代码性能(使用如 Criterion 的库)
一、Criterion 基准测试
Criterion.rs 是 Rust 最流行的基准测试库,提供统计学支持的精确测量。
使用步骤:
- 添加依赖(
Cargo.toml):
[dev-dependencies]
criterion = "0.5"
[[bench]]
name = "my_bench"
harness = false
- 创建基准文件(
benches/my_bench.rs):
use criterion::{black_box, criterion_group, criterion_main, Criterion};
fn fibonacci(n: u64) -> u64 {
match n {
0 => 1,
1 => 1,
_ => fibonacci(n-1) + fibonacci(n-2),
}
}
fn bench_fib(c: &mut Criterion) {
c.bench_function("fib 20", |b| b.iter(|| fibonacci(black_box(20))));
}
criterion_group!(benches, bench_fib);
criterion_main!(benches);
- 运行基准测试:
cargo bench
Criterion 特性:
- 自动生成 HTML 报告(在
target/criterion/) - 统计显著性分析
- 性能趋势对比
- 支持异步代码测试
二、集成测试 (Integration Tests)
用于测试库的公共 API,每个测试文件都是独立 crate。
实现步骤:
- 创建测试目录:
mkdir tests
- 编写测试文件(
tests/integration_test.rs):
// 导入被测库
use my_crate::public_api;
#[test]
fn test_public_interface() {
let result = public_api(2, 3);
assert_eq!(result, 5);
}
// 测试错误场景
#[test]
#[should_panic(expected = "Out of bounds")]
fn test_error_case() {
public_api(100, 200);
}
- 运行测试:
cargo test --test integration_test
集成测试特点:
| 特性 | 说明 |
|---|---|
| 独立编译单元 | 每个 tests/*.rs 是独立 crate |
| 仅访问公共 API | 无法测试私有函数 |
| 支持测试组织结构 | 可使用 tests/common/mod.rs 共享工具函数 |
| 模拟外部依赖 | 可与 mockall 等库配合使用 |
三、与单元测试对比
// 单元测试示例 (src/lib.rs)
#[cfg(test)]
mod tests {
#[test]
fn test_private_function() {
assert_eq!(internal_logic(), 42); // 可测试私有函数
}
}
| 测试类型 | 位置 | 访问权限 | 典型用途 |
|---|---|---|---|
| 单元测试 | src/**/*.rs |
私有+公共 | 模块内部逻辑验证 |
| 集成测试 | tests/*.rs |
仅公共 API | 端到端功能验证 |
| 基准测试 | benches/*.rs |
需显式导入 | 性能优化验证 |
最佳实践
-
Criterion 使用建议:
- 用
black_box防止编译器过度优化 - 基准测试至少运行 5 秒以获得稳定结果
- 使用
cargo criterion -- --save-baseline master保存基准
- 用
-
集成测试技巧:
// 共享工具模块 (tests/common/mod.rs) pub fn setup() -> TestContext { // 初始化测试环境 } // 测试文件 (tests/api_test.rs) mod common; use common::setup; -
测试覆盖率:
# 安装工具 cargo install cargo-tarpaulin # 运行测试覆盖 cargo tarpaulin --tests --ignore-tests
关键区别:Criterion 专注于代码性能指标(如执行时间、吞吐量),而集成测试验证功能正确性。两者通常结合使用:先通过集成测试确保功能正确,再用 Criterion 优化热点路径性能。
更多推荐
所有评论(0)