Rust编程语言有一个专门介绍测试的章节,建议阅读以了解基本概念。
通常将单元测试(可以更多地访问代码内部的测试)放置在每个特定文件中的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();
}
详细了解文件和模块如何相互映射,请参见将模块分离到不同文件中。
将测试放在单独的文件中的更常见的情况是集成测试。这些也在书中被提到,有一个专门针对 crate 外部的测试的章节。这种类型的测试非常适合作为代码的使用者来执行。
文档的这一部分包括一个简介示例和描述性的文字:
我们在项目目录的顶层旁边创建一个名为tests的目录,与src相邻。Cargo 知道在此目录中查找集成测试文件。然后,我们可以在此目录中创建任意数量的测试文件,Cargo会将每个文件都编译为一个独立的 crate。
让我们创建一个集成测试。在代码清单 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
,而这在单元测试中是不需要的。原因是tests目录中的每个测试都是一个独立的crate,因此我们需要将库引入每个测试crate的作用域。
请注意,该函数被称为adder::add_two
。有关Rust模块系统的更多详细信息可以在“包、Crate和模块”章节中找到。
由于这些测试会像用户一样使用您的crate,如果您想测试一个二进制文件,则应该执行该二进制文件。像assert_cmd这样的Crate可以帮助减轻这种类型测试的痛苦。
在其他情况下,您应该将大型二进制文件分解为大型库和小型二进制文件。然后,您可以为库的公共API编写集成测试。
另请参见:
tests
目录中的测试)?由于extern crate <executable>
不起作用,因此需要采取其他措施。 - Nawazstd::process::Command
的命令来运行构建出来的命令。否则,你所说的就是单元测试(unit tests)。 - Shepmastertest.rs
可以工作,而将其命名为foo_test.rs
在没有路径的情况下不起作用? - Tamil Vendhan Kanagarasu#[path]
属性,除非在非常特殊的情况下(而这不是其中之一)。 - Shepmaster