Rust 测试:框架与工具
Rust 是一种系统编程语言,非常注重可靠性和安全性。其内置的测试系统是核心特性之一,无需安装第三方框架即可编写高质量代码。本文将详细介绍 Rust 中用于测试的主要工具:从简单的单元测试到复杂的基于属性的测试和基准测试。
内置测试框架
在 Rust 中,测试通过 cargo test 命令运行。测试是带有 #[test] 属性的普通函数。该框架会自动收集项目中所有此类函数并运行它们。
单元测试
单元测试通常与待测代码放在同一文件中,位于单独的 tests 模块内。这样可以测试私有函数。
// src/lib.rspub fn add(a: i32, b: i32) -> i32 { a + b}
fn private_helper(x: i32) -> i32 { x * 2}
#[cfg(test)]mod tests { use super::*;
#[test] fn test_add() { assert_eq!(add(2, 3), 5); }
#[test] fn test_private_helper() { assert_eq!(private_helper(5), 10); }}运行:cargo test
集成测试
集成测试位于项目根目录的 tests/ 文件夹中。该文件夹中的每个文件都是一个独立的 crate,用于测试您的公共 API。
// tests/integration_test.rsuse my_crate::add;
#[test]fn test_add_integration() { assert_eq!(add(10, 20), 30);}断言宏
Rust 提供了几个内置宏用于编写断言:
assert!(expression)— 如果表达式为假则 panic。assert_eq!(left, right)— 使用PartialEq检查相等性。assert_ne!(left, right)— 检查不相等。debug_assert!()— 仅在 debug 构建中生效。
#[test]fn test_with_assert() { let result = some_function(); assert!(result.is_ok(), "期望 Ok,得到: {:?}", result); assert_eq!(result.unwrap(), 42);}文档测试
Rust 最强大的功能之一是在文档中直接编写测试。位于 /// 或 //! 块内的代码会自动编译并作为测试运行。
/// 将两个数相加。////// # 示例////// ```/// use my_crate::add;/// assert_eq!(add(1, 2), 3);/// ```pub fn add(a: i32, b: i32) -> i32 { a + b}运行:cargo test — 文档测试将与普通测试一起执行。
使用 proptest 进行基于属性的测试
proptest 库(类似于 Python 中的 Hypothesis 或 Haskell 中的 QuickCheck)可以生成随机输入数据并检查不变量。
use proptest::prelude::*;
fn reverse_string(s: &str) -> String { s.chars().rev().collect()}
proptest! { #[test] fn test_reverse_twice(s in ".*") { let reversed = reverse_string(&s); let double_reversed = reverse_string(&reversed); assert_eq!(s, double_reversed); }}安装:cargo add proptest
基准测试
在 Rust 中,可以通过 cargo bench 使用稳定的基准测试(从 Rust 1.78 开始),或者使用 criterion crate 处理更复杂的场景。
内置基准测试(nightly)
#![feature(test)]extern crate test;
#[bench]fn bench_add(b: &mut test::Bencher) { b.iter(|| add(1, 2));}使用 criterion 进行基准测试
图书馆中也有
推荐