You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

6.6 KiB

image-20230309152409191

image-20230309151658572

image-20230309151916594

Testing Equality with the assert_eq! and assert_ne! Macros

assert!宏用于执行 == 操作。再此基础上,标准库还提供了一对宏 assert_eq!和assert_ne! 分别比较相等或不相等的两个论点。如果断言失败,它们还会打印两个值,这使得更容易看到测试失败的原因;相反,assert!宏仅指示它为==表达式获取了一个假值,而不打印导致该假值的值。

使用assert_eq!宏,断言失败时:

image-20230309154720180

使用assert_nq!宏,断言失败时:

image-20230309155053448

assert_eq!和assert_ne!宏分别使用运算符==和!=。当断言失败时,这些宏使用调试格式打印它们的参数,这意味着要比较的值必须实现PartialEqdebug特征。所有基本类型和大多数标准库类型都实现了这些特征。对于自己定义的结构体和枚举,需要实现PartialEq来断言这些类型的相等性。当断言失败时,还需要实现Debug来打印值。#[derive(PartialEq, Debug)]。

Adding Custom Failure Messages

可以将要与失败消息一起打印的自定义消息添加为assert!assert_eq!assert_ne!宏的可选参数。

image-20230309161947925

assert_eq!assert_ne!时写法:

image-20230309162455307

Checking for Panics with should_panic

检查代码是否如所期望的那样处理错误。使用should_panic属性,如果函数内的代码出现panic,则测试通过;如果函数内的代码不恐慌,则测试失败

当没有panic时,效果如下:

image-20230309165534578

should_panic 即使测试恐慌的原因与我们预期的不同,should_panic测试也会通过。可通过添加一个可选的预期参数,让should_panic测试更准确。

image-20230310134325891

失败情况:

image-20230310134601301

Using Result<T, E> in Tests

测试失败时会产生恐慌,可以通过 Result<T,E> 返回一个Err, 使恐慌消失。

image-20230310142453605

控制测试的运行方式

默认情况下,由 cargo test 生成的二进制文件会并行运行所有测试,并捕获测试运行期间生成的输出,以便更容易阅读与测试结果相关的输出信息。但是,您可以使用命令行选项来更改此默认行为。

Running Tests in Parallel or Consecutively

当你运行多个测试时,默认情况下它们会使用线程并行运行,这意味着它们完成测试的速度更快,你可以更快地得到反馈。因为测试同时运行,所以你必须确保你的测试不依赖于彼此或任何共享状态,包括共享环境,例如当前工作目录或环境变量。

默认情况下,cargo test 会根据可用的 CPU 核心数量自动选择并发运行测试的线程数。具体来说,它会为每个 CPU 核心分配一个线程,最多不会超过8个线程。

$ cargo test -- --test-threads=1

测试线程数设为1,即不使用并行性。测试时间会更多,但如果用例间共享状态,则测试不会相互干扰。

Showing Function Output

默认情况下,如果测试通过,Rust 的测试库会捕获任何打印到标准输出的内容。

可使用 $ cargo test -- --show-output

image-20230310145558520

使用 $ cargo test -- --nocapture时:

image-20230310145404690

相对而言 show-output 界面更好。

--show-output 选项用于显示测试运行期间的输出信息。--nocapture 选项用于禁止捕获测试运行期间的输出信息。如果同时使用这两个选项,--show-output 选项会覆盖 --nocapture 选项。

Running a Subset of Tests by Name

可以指定要运行的部分代码。会按名称进行匹配,匹配多少运行多少。cargo test [名称],只要测试用例名称包含提供的字段,就会运行(多个或单个)。

当名称设为add时:

image-20230310151923207

Filtering to Run Multiple Tests

#[ignore] 属性,使测试时排除他们。

image-20230310152114535

cargo test -- --ignoredcargo test -- --include-ignored 都是用来运行被标记为ignored的测试的。

cargo test -- --ignored 运行被标记为ignored的测试,但是不会运行没有被标记为ignored的测试。这个选项是用来运行已知失败的测试或者还没有完成的测试的。也就是说,它只运行被标记为ignored的测试,而不管其他的测试是否通过。

例如,如果你有一个测试被标记为ignored,并且在这个测试通过之前你不想运行其他测试,你可以使用cargo test -- --ignored来只运行这个测试。

image-20230310152809699

相反,cargo test -- --include-ignored 会运行所有测试,包括那些被标记为ignored的测试。这个选项是用来在某些情况下,你需要知道所有测试的状态,包括已知失败的测试或还没有完成的测试的时候使用的。

image-20230310152735856