用例编写Rust中的测试

332 阅读4分钟

Rust在过去五年中连续成为最受喜爱的编程语言。Rust是一种低级静态类型的多范式编程语言,专注于安全性能

Rust解决了C/C++长期以来一直纠结的问题,如内存错误构建并发程序。由于有了借贷检查器,Rust可以在编译时防止数据竞赛。当两个 线程同时访问相同的内存时,就会发生数据竞赛,它们会导致不可预知的行为。值得庆幸的是,防止未定义行为是Rust的全部内容。Rust还允许你编写测试用例,以检查你的代码是否正确。

测试是指编写的代码,其目的是测试非测试代码是否工作正常。测试包括以下主要过程。

  1. 设置任何需要的数据或状态。
  2. 运行你要测试的代码。
  3. 断言结果是你所期望的。

现在让我们来看看Rust中测试的更多信息。

Test automation tools: 8 trends and techniques to watch | TechBeaconTest automation tools: 8 trends and techniques to watch | TechBeacon

测试函数

Rust中的测试函数是一个由test 属性注释的函数。属性是我们写在**#**符号后面的方括号里的东西。它们告诉我们关于它们后面的代码的一些重要事情。我们在结构前使用了 #[derive]在结构之前。所以为了使一个函数成为测试用例,我们在函数前写上 #[test]在该函数之前。

举例来说

#[test]
fn code_success(){
     ...
}

上面的函数代表了Rust中的一个测试案例。我们可以按照同样的方法编写Rust中的测试函数,来编写尽可能多的 测试案例

为了测试代码,换句话说,为了运行测试用例,我们需要运行一个命令。

cargo test

这个命令使用我们编写的测试用例,并执行它们,从而产生一个通过和失败的测试用例的详细报告。

创建测试文件

现在,我们将建立一个演示项目来展示我们如何在Rust项目中编写测试用例。首先,我们将创建一个新的Rust项目。为了创建一个库项目,我们运行以下命令

cargo new demo --lib

这个命令将为我们创建一个全新的库项目。在这个项目中,我们将看到一个 **src**文件夹。打开这个 **src**文件夹,并打开其中的 **lib.rs**文件。

我们将编写我们想要测试的代码。让我们做一个程序来检查一个给定的数字是否是偶数。

在该文件中写下以下代码 **lib.rs**文件。

fn is_even(num:i32) -> bool {
    if num % 2 == 0{
        true
    }
    else { false }
}

这个函数接收一个i32 参数并检查该数字是否为偶数。它返回一个bool值作为结果。

现在,我们将创建一个 **test.rs**文件夹中的 **src**文件夹,其中将包含我们的测试用例。在文件夹中创建一个Rust文件,并在该文件中复制以下代码 **src**文件夹,并在该文件中复制以下代码。

use crate::is_even;

#[test]
fn check_even_success(){
    assert!(is_even(6));
}

#[test]
fn check_even_failure(){
    assert_eq!(is_even(7),false);
}

上面的代码使用测试 属性创建了两个测试函数,名字分别为 check_even_successcheck_even_failure。这两个函数使用 assert!和 assert_eq!宏来决定如何处理测试用例。assert!宏如果传递给它一个真值,则通过测试用例。同样,assert_eq!宏比较两个给定的值,如果它们相等就通过测试用例。

现在,为了测试这段代码,我们把这个 **test.rs**模块包含在我们的 **lib.rs**文件中,在文件的顶部添加以下一行 **lib.rs**文件的顶部添加以下一行。

mod test;

这将把该 **test.rs**文件与 **lib.rs**文件。

测试代码

现在,我们可以开始了。打开项目根目录下的终端,运行cargo test命令来测试我们编写的代码。

我们看到下面的输出。

   Compiling demo v0.1.0 (/home/knoldus/demo)
    Finished test [unoptimized + debuginfo] target(s) in 0.24s
     Running unittests (target/debug/deps/demo-3865032985419301)

running 2 tests
test test::check_even_success ... ok
test test::check_even_failure ... ok

test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

   Doc-tests demo

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

这告诉我们,我们的代码是正确的,所有的测试案例都成功通过。