在Rust中,单元测试是通过在代码中编写#[test]
属性的函数来实现的。这些测试函数通常放在与它们所测试的模块相同的文件中,文件名以_test.rs
结尾。Rust的测试框架是内置的,不需要额外的依赖。
以下是一个简单的Rust单元测试示例:
cargo new my_project --lib
cd my_project
src/lib.rs
文件中,编写一个简单的函数和一个测试函数:// src/lib.rs
pub fn add(a: i32, b: i32) -> i32 {
a + b
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_add() {
assert_eq!(add(1, 2), 3);
assert_eq!(add(-1, 1), 0);
assert_eq!(add(0, 0), 0);
}
}
在这个例子中,我们定义了一个add
函数,它接受两个i32
整数并返回它们的和。然后,我们创建了一个名为tests
的模块,并使用#[cfg(test)]
属性标记它。这意味着这个模块只会在运行测试时编译。
在tests
模块中,我们编写了一个名为test_add
的测试函数,它使用assert_eq!
宏来检查add
函数的输出是否与预期相符。
在项目根目录下,运行以下命令来执行测试:
cargo test
这将编译你的项目并运行所有标记为#[test]
的测试函数。如果所有测试都通过,你将看到类似以下的输出:
running 1 test
test tests::test_add ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
如果有测试失败,cargo test
将显示失败的详细信息,帮助你诊断问题。
Rust还提供了许多其他有用的宏和特性,例如#[should_panic]
(用于测试恐慌情况)和#[bench]
(用于基准测试)。更多关于Rust测试的信息,请参阅Rust官方文档。