测试的分类
- Rust 对测试的分类:
- 单元测试
- 集成测试
- 单元测试:
- 小、专注
- 一次对一个模块进行隔离的测试
- 可测试 private 接口
集成测试:
tests 模块上的 #[cfg(test)] 标注:
- 只有运行 cargo test 才编译和运行代码
- 运行 cargo build 则不会
- 集成测试在不同的目录,它不需要 #[cfg(test)] 标注
cfg:configuration(配置)
Rust 允许测试私有函数 ```rust pub fn add_two(a: i32) -> i32 { internal_adder(a, 2) }
fn internal_adder(a: i32, b: i32) -> i32 { a + b }
[cfg(test)]
mod tests { use super::*;
#[test]
fn it_works() {
assert_eq!(4, internal_adder(2, 2));
}
}
<a name="tSJer"></a>
## 集成测试
- 在 Rust 里,集成测试完全位于被测试库的外部
- 目的:是测试被测试库的多个部分是否能正确的一起工作
- 集成测试的覆盖率很重要
<a name="n7J7g"></a>
## tests目录
- 创建集成测试:tests 目录和 src 目录同级
- tests 目录下的每个测试文件都是单独的一个 crate
- 需要将被测试库导入
- 无序标注 #[cfg(test)],tests 目录被特殊对待
- 只有 cargo test,才会编译 tests 目录下的文件
```rust
use adder;
#[test]
fn it_adds_two() {
assert_eq!(4, adder::add_two(2));
}
运行指定的集成测试
- 运行一个特定的集成测试函数:cargo test 函数名
- 运行某个测试文件内的所有测试:cargo test —test 文件名 ```rust use should_panic;
[test]
fn it_really_adds_two() { assert_eq!(5, should_panic::add_two(3)); }
`cargo test --test integration_test `
<a name="X79QT"></a>
## 集成测试中的子模块
- tests 目录下每个文件被编译成单独的 crate
- 这些文件不共享行为(与 src 下的文件规则不同)
> 在 tests 目录下新建帮助文件 common.rs
```rust
pub fn setup() {}
应该在 tests 目录下建立一个子目录 common,新建 mod.rs 文件
pub fn setup() {}
tests 目录下的子目录不会被视为单个的crate进行编译,更不会在测试的输出中拥有自己的区域。因为子目录只是一个普通的模块而已,现在它就可以应用在不同的集成测试文件中。
use should_panic;
mod common;
#[test]
fn it_adds_two() {
common::setup();
assert_eq!(4, should_panic::add_two(2));
}
针对 binary crate 的集成测试
- 如果项目是 binary crate,只含有 src/main.rs 没有 src/lib.rs:
- 不能再 tests 目录下创建集成测试
- 无法把 main.rs 的函数导入作用域
- 只有 library crate 才能暴露函数给其他 crate 用
- binary crate 意味着独立运行