Rust 测试:Criterion 基准测试与集成测试

在 Rust 中,测试主要分为三类:

  1. 单元测试:测试单个模块内部功能(通常写在 src/ 文件中)
  2. 集成测试:测试库的公共 API(位于 tests/ 目录)
  3. 基准测试:测量代码性能(使用如 Criterion 的库)
一、Criterion 基准测试

Criterion.rs 是 Rust 最流行的基准测试库,提供统计学支持的精确测量。

使用步骤:
  1. 添加依赖Cargo.toml):
[dev-dependencies]
criterion = "0.5"

[[bench]]
name = "my_bench"
harness = false

  1. 创建基准文件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);

  1. 运行基准测试
cargo bench

Criterion 特性:
  • 自动生成 HTML 报告(在 target/criterion/
  • 统计显著性分析
  • 性能趋势对比
  • 支持异步代码测试
二、集成测试 (Integration Tests)

用于测试库的公共 API,每个测试文件都是独立 crate。

实现步骤:
  1. 创建测试目录
mkdir tests

  1. 编写测试文件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);
}

  1. 运行测试
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 需显式导入 性能优化验证
最佳实践
  1. Criterion 使用建议

    • black_box 防止编译器过度优化
    • 基准测试至少运行 5 秒以获得稳定结果
    • 使用 cargo criterion -- --save-baseline master 保存基准
  2. 集成测试技巧

    // 共享工具模块 (tests/common/mod.rs)
    pub fn setup() -> TestContext {
        // 初始化测试环境
    }
    
    // 测试文件 (tests/api_test.rs)
    mod common;
    use common::setup;
    

  3. 测试覆盖率

    # 安装工具
    cargo install cargo-tarpaulin
    
    # 运行测试覆盖
    cargo tarpaulin --tests --ignore-tests
    

关键区别:Criterion 专注于代码性能指标(如执行时间、吞吐量),而集成测试验证功能正确性。两者通常结合使用:先通过集成测试确保功能正确,再用 Criterion 优化热点路径性能。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐