并行和连续执行测试
控制测试如何运行
改变cargo test的行为:添加命令行参数
默认行为:
并行运行
所有测试
捕获(不显示)所有输出,使读取与测试结果相关的输出更容易
命令行参数:
针对cargo test的参数:紧跟cargo test 后
针对测试可执行程序:放在--之后
cargo test --help
cargo test -- --help
并行运行测试
运行多个测试:默认使用多个线程并行运行
运行块
确保测试之间:
不会相互依赖
不依赖于某个共享状态(环境、工作目录、环境变量等)
--test-threads参数
传递给二进制文件
不想以并行方式运行测试,或想对线程数进行细粒度控制
可以使用--test-threads参数,后面跟着线程的数量
例如:cargo test -- --test-threads=1
显式函数输出
默认,如厕时通过,Rust的test库会捕获所有打印到标准输出的内容
例如,如果是被测试代码中用到了println!:
如果测试通过:不会在终端看到println!打印的内容
如果测试失败:会看到println!打印和失败信息
如果想在成功的测试中看到打印的内容:--show-output
(例子)
cargo test -- --show-output
按名称运行测试
按名称运行测试的子集
选择运行的测试:将测试的名称(一个或多个)作为cargo test的参数
cargo test it_works(函数名)
运行多个测试:指定测试名的一部分(模块名也可以)
忽略测试
忽略某些测试,运行剩余测试
ignore属性(attribute)
#[cfg(test)]
mod tests {
// use super::*;
#[test]
fn it_works() -> Result<(), String> {
if 2 + 2 == 4 {
Ok(())
} else {
Err(String::from("two plus two dose not equal four"))
}
}
#[test]
#[ignore]
fn expensive_test() {
assert_eq!(5, 1 + 1 + 1 + 1 + 1);
}
}
运行被忽略的测试
cargo test -- --ignored
测试组织
测试的分类
Rust对测试的分类:
单元测试
集成测试
单元测试
小、专注
一次对一个模块进行隔离的测试
可测试private接口
集成测试:
在库外部。和其他外部代码一样使用你的代码
只能使用public接口
可能在每个测试中使用到多个模块
单元测试——#[cfg(test)]标注
test模块上的#[cfg(test)]标注
只有运行cargo test才编译和运行代码
运行cargo build则不会
集成测试在不同的目录,它不需要#[cfg(test)]标注
cfg: configuration(配置)
告诉Rust下面的条目只有在指定的配置选项下才被包含
配置选项test:由Rust提供,用编译和运行测试
只有cargo test才会编译代码,包括模块中的helper函数和#[test]标注的函数
测试私有函数
Rust允许测试私有函数
集成测试
集成测试
在Rust里,集成测试完全位于被测试库的外部
目的:是测试被测试库的多个部分是否能正确的一起工作
集成测试的覆盖率很重要
test目录
创建集成测试:test目录
tests目录下得每个测试文件都是单独的一个crate
需要将被测试库导入
无需标注#[cfg(test)], tests目录被特殊对待
运行指定的集成测试
运行一个特定的集成测试:cargo test函数名
运行某个测试文件内的所有测试:cargo test --test文件名
cargo test --test intergration_test
集成测试中的子模块
tests目录下每个文件被编译成单独的crate
这些文件不共享行为(于src下得规则不同)
针对binary crate的集成测试
如果项目是binary crate,只含有src/main.rs没有src/lib.rs:
不能在tests目录下创建集成测试
无法把main.rs的函数导入作用域
只有把library crate才能暴露函数给其他crate用
binary crate意味着独立运行
总结
学着学着不知道自己为什么学了,算了,继续吧,学都学了。