测试的分类

  • Rust 对测试的分类:
    • 单元测试
    • 集成测试
  • 单元测试:
    • 小、专注
    • 一次对一个模块进行隔离的测试
    • 可测试 private 接口
  • 集成测试:

    • 在库外部。和其他外部代码一样使用你的代码
    • 只能使用 public 接口
    • 可能在每个测试中使用到多个模块

      单元测试

      #[cfg(test)] 标注

  • tests 模块上的 #[cfg(test)] 标注:

    • 只有运行 cargo test 才编译和运行代码
    • 运行 cargo build 则不会
  • 集成测试在不同的目录,它不需要 #[cfg(test)] 标注
  • cfg:configuration(配置)

    • 告诉 Rust 下面的条目只有在指定的配置选项下才被包含
    • 配置选项 test:由 Rust 提供,用来编译和运行测试。
      • 只有 cargo test 才会编译代码,包括模块中的 helper函数和 #[test] 标注的函数
        1. #[cfg(test)]
        2. mod tests {
        3. #[test]
        4. fn it_works() {
        5. assert_eq!(4, 2 + 2);
        6. }
        7. }

        测试私有函数

  • 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::*;

  1. #[test]
  2. fn it_works() {
  3. assert_eq!(4, internal_adder(2, 2));
  4. }

}

  1. <a name="tSJer"></a>
  2. ## 集成测试
  3. - 在 Rust 里,集成测试完全位于被测试库的外部
  4. - 目的:是测试被测试库的多个部分是否能正确的一起工作
  5. - 集成测试的覆盖率很重要
  6. <a name="n7J7g"></a>
  7. ## tests目录
  8. - 创建集成测试:tests 目录和 src 目录同级
  9. - tests 目录下的每个测试文件都是单独的一个 crate
  10. - 需要将被测试库导入
  11. - 无序标注 #[cfg(test)],tests 目录被特殊对待
  12. - 只有 cargo test,才会编译 tests 目录下的文件
  13. ```rust
  14. use adder;
  15. #[test]
  16. fn it_adds_two() {
  17. assert_eq!(4, adder::add_two(2));
  18. }

运行指定的集成测试

  • 运行一个特定的集成测试函数:cargo test 函数名
  • 运行某个测试文件内的所有测试:cargo test —test 文件名 ```rust use should_panic;

[test]

fn it_really_adds_two() { assert_eq!(5, should_panic::add_two(3)); }

  1. `cargo test --test integration_test `
  2. <a name="X79QT"></a>
  3. ## 集成测试中的子模块
  4. - tests 目录下每个文件被编译成单独的 crate
  5. - 这些文件不共享行为(与 src 下的文件规则不同)
  6. > tests 目录下新建帮助文件 common.rs
  7. ```rust
  8. pub fn setup() {}

应该在 tests 目录下建立一个子目录 common,新建 mod.rs 文件

  1. pub fn setup() {}

tests 目录下的子目录不会被视为单个的crate进行编译,更不会在测试的输出中拥有自己的区域。因为子目录只是一个普通的模块而已,现在它就可以应用在不同的集成测试文件中。

  1. use should_panic;
  2. mod common;
  3. #[test]
  4. fn it_adds_two() {
  5. common::setup();
  6. assert_eq!(4, should_panic::add_two(2));
  7. }

针对 binary crate 的集成测试

  • 如果项目是 binary crate,只含有 src/main.rs 没有 src/lib.rs:
    • 不能再 tests 目录下创建集成测试
    • 无法把 main.rs 的函数导入作用域
  • 只有 library crate 才能暴露函数给其他 crate 用
  • binary crate 意味着独立运行