喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(=^・ω・^=)
11.9.1. 测试的分类
Rust把测试分为两类,一个是单元测试 ,一个是集成测试。
- 单元测试比较小也比较专注,每次只对一个模块进行隔离的测试,还可以测试私有的(private)接口。
- 集成测试完全位于代码库之外,它和其他外部代码一样地使用你的代码,集成测试只能访问公共的(public)接口,并且在每个测试中可能使用到多个模块。
11.9.2. #[cfg(test)]
标注
单元测试的目的在于将一小段代码隔离出来从而迅速地确定这段代码的功能是否符合预期,而且我们通常把单元测试和被测试的代码都放在src
目录下的同一个文件中。
同时,约定俗成的,每个源代码文件都要建立一个test
模块来放这些函数,并且使用#[cfg(test)]
来对测试模块进行标注。使用它进行标注的模块只有在运行cargo test
的时候会被编译和执行,在cargo build
时则不会。
以上是单元测试的规则。集成测试在不同的目录里,不需要#[cfg(test)]
标注。
#[cfg(test)]
中的cfg是英文configuration(配置)这个词的缩写,使用它就相当于告诉Rust被它标注的条目只有在指定的配置选项下才被包含。
看个例子:
rust
pub fn add(left: usize, right: usize) -> usize {
left + right
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn it_works() {
let result = add(2, 2);
assert_eq!(result, 4);
}
}
#[cfg(test)]
的配置选项就是test,test这个配置选项就是由Rust提供用来编译和运行测试的,只有在运行cargo test
的时候会编译和执行#[cfg(test)]
下的条目。
11.9.3. 测试私有函数
Rust允许测试私有函数,其他语言不一定。
看个例子:
rust
pub fn add_two(a: usize) -> usize {
internal_adder(a, 2)
}
fn internal_adder(left: usize, right: usize) -> usize {
left + right
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn internal() {
let result = internal_adder(2, 2);
assert_eq!(result, 4);
}
}
即使internal_adder
没有用pub
关键字来声明为公共,在测试模块中依然可以被调用。