暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

写给 Web 开发者的 Rust 语言入门教程(21.测试)

最后的叶子的奇妙小屋 2021-09-24
769

之前的文章:

0.引言

1.模块基础

2.变量

3.字符串

4.分支循环

5.数据表示

6.模块化

7.接口抽象

8.泛型

9.错误处理

10.内存布局

11.所有权

12.引用传递

13.引用字段

14.引用计数

15.泛化特化

16.闭包

17.普通宏

18.多线程

19.异步编程

20.工作区

本章主要介绍 rust 自身的测试体系,以及测试用例编写方法和注意事项。

测试函数

rust 自身有比较完整且很易用的测试体系,意在鼓励编写测试代码。

习惯上,可以直接在代码文件中内联一个测试模块,例如:

    fn add(a: u32, b: u32) -> u32 {
    a + b
    }


    fn main() {
    // ...
    }


    // 一个测试模块
    #[cfg(test)]
    mod test {
    use super::*;


    // 一个测试点
    #[test]
    fn add_one_two() {
    // 调用需要测试的函数
    let sum = add(1, 2);
    // 断言以上函数的运行结果:
    // 如果 sum 等于 3 则测试通过;
    // 否则产生一个 panic ,使测试不通过。
    assert_eq!(sum, 3);
        }




    }

    在测试函数内产生的任何 panic 都会使这个测试点不通过。不过,通常不直接用 panic! ,而是用 assert_eq! 来验证结果是不是符合预期。另外两个类似的宏是 assert! assert_ne! ,例如:

      fn add(a: u32, b: u32) -> u32 {
      a + b
      }


      fn main() {
      // ...
      }


      #[cfg(test)]
      mod test {
      use super::*;


      #[test]
          fn add_one_two() {
      // 调用需要测试的函数
      let sum = add(1, 2);
      // 断言以上函数的运行结果:
      // 如果 sum 不等于 2 则测试通过。
      assert_ne!(sum, 2);
              // 断言:
              // 如果 sum 大于 2 则测试通过。
      assert!(sum > 2);
      }
      }

      所有 #[test] 函数可以用 cargo test 命令来全部运行:

        cargo test

        如果只想运行某些指定的测试点,可以加上过滤器:

          cargo test add

          上面这个命令将只会运行函数名包含有 add 的测试点。

          crate 测试

          对于 lib 类型的 crate ,也可以将测试代码放在独立的文件中。

          首先在 Cargo.toml 中确保它是 lib crate :

            [lib]
            crate-type = ['rlib']

            然后就可以在 Cargo.toml 的同级目录中放置一个新目录 tests ,里面可以有若干个 *.rs 文件,每个文件都可以包含很多个测试点。例如在 tests/add.rs 中:

              // 引用当前的 crate
              // ( my_crate 需要是当前 crate 的名字)
              use my_crate::*;


              // 一个测试点
              #[test]
              fn add_one_two() {
              let sum = add(1, 2);
              assert_eq!(sum, 3);
              }

              这种方式比较适合对于整个 lib crate 的测试。

              测试输出

              在实际开发过程中,有时想要在测试代码中输出一些中间结果,例如:

                #[test]
                fn add_one_two() {
                let sum = add(1, 2);
                    println!("{}", sum);
                }

                然而上面这句 println! 并没有效果,因为默认情况下 cargo test 命令不会展示 #[test] 函数运行期间的输出。此时可以在命令末尾加上一个选项,使得输出能展示出来:

                  cargo test -- --show-output

                  rust 自带的测试体系其实是在鼓励写代码的同时写好测试点,提升项目代码质量。另一个 rust 自带的重要辅助功能是文档体系,同样是非常易用的,这将在之后的文章中介绍。

                  文章转载自最后的叶子的奇妙小屋,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                  评论