集成测试
单元测试是一次只隔离测试一个模块:它们很小并且可以测试私有代码。集成测试位于你的 crate 外部,并且只使用其公共接口,就像任何其他代码一样。它们的目的是测试库的多个部分能否协同工作正常。
Cargo 会在 src 旁边的 tests 目录中寻找集成测试。
文件 src/lib.rs
// Define this in a crate called `adder`.
pub fn add(a: i32, b: i32) -> i32 {
a + b
}
包含测试的文件: tests/integration_test.rs
#[test]
fn test_add() {
assert_eq!(adder::add(3, 2), 5);
}
使用 cargo test 命令运行测试
$ cargo test
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
Running target/debug/deps/integration_test-bcd60824f5fbfe19
running 1 test
test test_add ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
Doc-tests adder
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
tests 目录中的每个 Rust 源文件都被编译为一个单独的 crate。为了在集成测试之间共享一些代码,我们可以创建一个包含公共函数的模块,并在测试中导入和使用它。
文件 tests/common/mod.rs
pub fn setup() {
// some setup code, like creating required files/directories, starting
// servers, etc.
}
包含测试的文件: tests/integration_test.rs
// importing common module.
mod common;
#[test]
fn test_add() {
// using common code.
common::setup();
assert_eq!(adder::add(3, 2), 5);
}
将模块创建为 tests/common.rs 也能工作,但不推荐这样做,因为测试运行器会将该文件视为一个测试 crate,并尝试在其内部运行测试。