Rust 编程语言有a chapter dedicated to testing,您应该阅读它以获得基本理解。
通常将单元测试(更允许访问代码内部的测试)放入每个特定文件的test 模块中:
fn function_from_main() {
println!("Test OK");
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn my_test() {
function_from_main();
}
}
模块可以移动到新文件中,尽管这对于单元测试模块来说并不常见:
main.rs
fn function_from_main() {
println!("Test OK");
}
#[cfg(test)]
mod test;
test.rs
use super::*;
#[test]
fn my_test() {
function_from_main();
}
有关文件和模块如何相互映射的详细信息,请参阅Separating Modules into Different Files。
在单独文件中进行测试的更常见情况是集成测试。本书中的section devoted to tests outside of the crate 也涵盖了这些内容。这些类型的测试非常适合作为代码的使用者来执行代码。
文档的该部分包括一个介绍性示例和描述性文本:
我们在项目目录的顶层创建一个 tests 目录,
src 旁边。 Cargo 知道在这个里面寻找集成测试文件
目录。然后,我们可以在此创建尽可能多的测试文件
目录,Cargo 会将每个文件单独编译
板条箱。
让我们创建一个集成测试。仍然使用示例 11-12 中的代码
在 src/lib.rs 文件中,创建一个 tests 目录,创建一个新文件
命名为tests/integration_test.rs,输入示例11-13中的代码:
文件名:tests/integration_test.rs
use adder;
#[test]
fn it_adds_two() {
assert_eq!(4, adder::add_two(2));
}
示例 11-13:adder crate 中函数的集成测试
我们在代码顶部添加了use adder,我们不需要
单元测试。原因是测试目录中的每个测试都是
一个单独的板条箱,所以我们需要将我们的库带入每个测试
crate 的作用域。
请注意,该函数被称为adder::add_two。有关 Rust 模块系统的更多详细信息,请参阅Packages, Crates, and Modules chapter。
由于这些测试会像用户一样运行您的 crate,如果您想测试一个二进制文件,您应该执行二进制文件。像assert_cmd 这样的板条箱可以帮助减轻这种测试的痛苦。
在其他情况下,您应该将大型二进制文件分解为一个大型库和一个小型二进制文件。然后,您可以为库的公共 API 编写集成测试。
另见: