【Rust自学】11.10. 集成测试

瑞星  金牌会员 | 2025-1-12 09:06:28 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 862|帖子 862|积分 2586

喜好的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有爱好的可以关注专栏。谢谢喵!(=・ω・=)

11.10.1. 什么是集成测试

在Rust里,集成测试完全位于被测试库的外部。集成测试调用库的方式和其他代码一样,这也意味着集成测试只能调用对外公开的API。
集成测试的目的是验证被测试库的多个部门可否精确地一起工作,这一点有别于单元测试,单元测试比较小也比较专注,每次只对一个模块举行隔离的测试,还可以测试私有的(private)接口。
偶然候可以或许独立运行的一些单元代码在合在一起运用时也会发生问题,集成测试正是为了今早发现和办理这种问题存在的。以是说,集成测试的覆盖率很告急
11.10.2. tests目录

创建集成测试必要先创建tests目录。
这个目录是与src目录并列,cargo会自动在这个目录下探求集成测试文件。在这个目录下可以创建恣意多的集成测试文件,cargo会在编译时把每个测试文件都处理惩罚为一个单独的包,也就是一个单独的crate。
下面来演示一下创建集成测试文件:
1. 创建tests目录

在与src同级的目录下创建名为tests的文件夹:

2. 创建测试文件

在tests目录下创建.rs的测试文件,给它取个名字,这里我起的是integration_test.rs:

3. 把测试代码移到测试文件里

以上一篇文章的代码为例(lib.rs):
  1. pub fn add_two(a: usize) -> usize {
  2.     internal_adder(a, 2)
  3. }
  4. fn internal_adder(left: usize, right: usize) -> usize {
  5.     left + right
  6. }
  7. #[cfg(test)]
  8. mod tests {
  9.     use super::*;
  10.     #[test]
  11.     fn internal() {
  12.         let result = internal_adder(2, 2);
  13.         assert_eq!(result, 4);
  14.     }
  15. }
复制代码
由于每一个集成测试文件都是一个单独的crate,以是这个文件(integration_test.rs)想要测试lib.rs这个crate的内容就得先导入作用域。
在这个例子中,由于我给这个项目命名为RustStudy,以是这个package(包)的名字就是RustStudy,假如你不清楚可以到你的cargo.toml里看name这个参数。在这个例子中,导入作用域写:use RustStudy;即可,假如你想指定到具体的函数也行。
导入完后直接写测试函数就可以,不必要写#[cfg(test)],由于tests目录下的代码只会在运行cargo test的时候被实行,只必要给测试函数标注#[test]即可。
整体代码如下(integration_test.rs):
  1. use RustStudy;
  2. #[test]
  3. fn it_adds_two() {
  4.     let result = RustStudy::add_two(2);
  5.     assert_eq!(result, 4);
  6. }
复制代码
输出:
  1. $ cargo test
  2.    Compiling adder v0.1.0 (file:///projects/adder)
  3.     Finished `test` profile [unoptimized + debuginfo] target(s) in 1.31s
  4.      Running unittests src/lib.rs (target/debug/deps/adder-1082c4b063a8fbe6)
  5. running 1 test
  6. test tests::internal ... ok
  7. test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
  8.      Running tests/integration_test.rs (target/debug/deps/integration_test-1082c4b063a8fbe6)
  9. running 1 test
  10. test it_adds_two ... ok
  11. test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
  12.    Doc-tests adder
  13. running 0 tests
  14. test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
复制代码
可以看到,这个输出显示运行了两个测试,这是由于一个是来自lib.rs的测试(单元测试),一个是来自integration_test.rs的测试(集成测试)。
11.10.3. 运行指定的集成测试

运行一个特定的集成函数,可以使用cargo test 指定的函数名;运行某个测试文件内的全部测试函数,可以使用cargo test --test 文件名。
看个例子:

如今tests下有两个文件,假如我只希望运行integration_test.rs里的测试函数,那么就输入指令:
  1. cargo test --test integration_test
复制代码
11.10.4. 集成测试中的子模块

由于tests目录下的每个文件被编译成单独的crate,以是这些文件互不共享举动(与src目录下的文件规则不同)。
那假如我想将测试函数中重复出现的逻辑提取到一个helper函数中,避免代码重复,该怎么写呢?
举个例子,我在tests目录下写了common.rs这个文件用于存储helper函数:

试试实行测试:
  1. $ cargo test
  2.    Compiling adder v0.1.0 (file:///projects/adder)
  3.     Finished `test` profile [unoptimized + debuginfo] target(s) in 0.89s
  4.      Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4)
  5. running 1 test
  6. test tests::internal ... ok
  7. test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
  8.      Running tests/common.rs (target/debug/deps/common-92948b65e88960b4)
  9. running 0 tests
  10. test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
  11.      Running tests/integration_test.rs (target/debug/deps/integration_test-92948b65e88960b4)
  12. running 1 test
  13. test it_adds_two ... ok
  14. test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
  15.    Doc-tests adder
  16. running 0 tests
  17. test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
复制代码
可以看到,在测试效果中出现了对common.rs的测试。但由于common.rs是用来存储helper函数的,以是它本身不必要也没必要被测试,这种写法是错误的。
精确的做法是在tests目录下创建一个common目录,在里面创建mod.rs,把helper函数都放到这里面来,把原来的common.rs删掉即可:

这实际上是另外一种可以被Rust理解的命名规范,Rust不会把common模块视作为集成测试文件,而在测试输出中也不会出现common了,由于tests下的子目录不会被视为单独的crate举行编译。
假如要在集成测试文件中使用这里面的内容,只必要在文件开头写mod 文件夹名;即可,在这个例子中就是mod common;。使用时写common::你想要的函数,在这个例子中就是common::setup()
11.10.5. 针对binary crate的集成测试

假如项目是二进制包(binary crate),也就是只含有src/main.rs没有src/lib.rs,就不可以在tests目录下创建集成测试,即使有,也无法把main.rs的函数导入作用域。由于只有library crate(也就是有lib.rs)才能暴露函数给其它crate用。
binary crate意味着独立运行。因此,Rust的binary项目通常会把这些逻辑都放在lib.rs里,而在main.rs里只有简单的调用。如许做项目就会被视为library crate,就可以使用集成测试来检查代码。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

瑞星

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表