Rust 测试:框架与工具

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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 进行基准测试



推荐