Rust 测试:框架与工具

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

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

开始课程

Rust 测试:框架与工具



Rust 是一种系统编程语言,非常注重代码的可靠性和安全性。其内置的测试系统允许开发人员编写单元测试、集成测试和文档测试,而无需安装额外的库。然而,对于复杂的场景——如参数化、随机数据生成或模拟——Rust 社区创建了强大的框架。在本文中,我们将探讨 Rust 中的关键测试工具。



内置 test 模块



Rust 附带内置的 test 模块,通过 #[test] 属性激活。使用 cargo test 命令运行测试。一个简单的单元测试示例:



// src/lib.rspub fn add(a: i32, b: i32) -> i32 {    a + b}

#[cfg(test)]mod tests { use super::*;

#[test] fn test_add() { assert_eq!(add(2, 2), 4); }

#[test] fn test_add_negative() { assert_eq!(add(-1, 1), 0); }}


内置模块的关键功能:

  • 属性:#[test]、#[ignore]、#[should_panic]。
  • 断言宏:assert!、assert_eq!、assert_ne!。
  • 集成测试:放置在 tests/ 文件夹中,测试公共 API。
  • 文档测试:文档注释中的代码示例,通过 cargo test 进行验证。


对于大多数项目来说,这已经足够了。但当需要参数化、随机数据生成或模拟时,专门的框架就会派上用场。



rstest 框架——参数化测试



rstest 库提供了一种强大的测试参数化机制,类似于 Python 中的 pytest。它允许指定多组输入数据和预期结果,而无需重复代码。



安装:

[dev-dependencies]rstest = "0.22"


参数化测试示例:



use rstest::rstest;

#[rstest]#[case(1, 2, 3)]#[case(0, 0, 0)]#[case(-1, 1, 0)]fn test_add(#[case] a: i32, #[case] b: i32, #[case] expected: i32) { assert_eq!(add(a, b), expected);}


rstest 的功能:

  • 通过 #[case] 进行参数化。
  • 通过 #[random] 生成随机数据。
  • 通过 #[fixture] 提供上下文夹具。
  • 支持异步测试。


该框架在测试数学函数、解析器或算法时特别有用,因为需要检查许多边界情况。



使用 proptest 进行基于属性的测试



基于属性的测试是一种方法,您描述所有可能输入数据都应满足的不变量(属性)。proptest 库生成随机输入数据并检查这些属性。



安装:

[dev-dependencies]proptest = "1.5"


示例:验证排序保持长度和所有元素:



use proptest::prelude::*;

proptest! { #[test] fn test_sort_keeps_elements(mut vec: Vec<i32>) { let original_len = vec.len(); let mut sorted = vec.clone(); sorted.sort(); assert_eq!(sorted.len(), original_len); for item in &vec { assert!(sorted.contains(item)); } }}


proptest 的优势:

  • 自动生成数千个随机场景。
  • 最小化(shrink)——当测试失败时,

推荐