From 19a5a4a241b847180385db1258ee241b67c04062 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BB=A4=E7=8B=90=E4=B8=80=E5=86=B2?= <43949039+anonymousGiga@users.noreply.github.com> Date: Thu, 18 May 2023 11:00:13 +0800 Subject: [PATCH] Create chapter_3_18_2.md --- src/chapter_3/chapter_3_18_2.md | 113 ++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 src/chapter_3/chapter_3_18_2.md diff --git a/src/chapter_3/chapter_3_18_2.md b/src/chapter_3/chapter_3_18_2.md new file mode 100644 index 0000000..35647e1 --- /dev/null +++ b/src/chapter_3/chapter_3_18_2.md @@ -0,0 +1,113 @@ +# 3.18.2运行测试 +上一节演示了如何编写测试,对于运行测试则只提到了简单的命令cargo test。本节对执行测试进行详细介绍。 +## 1. 并行或连续运行测试 +当运行多个测试时,Rust默认使用线程并行运行。如果不希望测试并行运行,或者更加精确的控制线程的数量,可以传递 --test-threads参数来控制,示例如下: +``` +cargo test -- --test-threads=1 # 使用一个线程运行测试 +``` + +## 2. 显示测试中的打印 +有的时候,需要在运行测试时打印内容到标准输出,可以添加-- --nocapture或者-- --show-output,例如有如下代码: +```Rust +pub fn add(left: usize, right: usize) -> usize { + left + right +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + let result = add(2, 2); + println!("result = {:?}", result); // 打印到标准输出 + assert_eq!(result, 4); // 用断言进行判断结果 + } +} +``` +要在运行测试时显示12行的打印,可以运行如下命令: +``` +cargo test -- --nocapture +``` +或者 +``` +cargo test -- --show-output +``` + +## 3. 运行单个测试 +运行测试时,可以通过指定测试函数的名字来运行某个特定的测试函数。例如有如下测试代码: +```Rust +pub fn add_two(a: i32) -> i32 { + a + 2 +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn add_two_and_two() { + assert_eq!(4, add_two(2)); + } + + #[test] + fn add_three_and_two() { + assert_eq!(5, add_two(3)); + } + + #[test] + fn one_hundred() { + assert_eq!(102, add_two(100)); + } +} +``` +通过指定函数名运行特定的测试函数,下面的命令只会运行函数add_two_and_two: +``` +cargo test add_two_and_two +``` + +执行结果如下图: + +![注释](../../assets/59.png) + +## 4. 过滤运行测试 +还可以指定部分测试的名称,任何名称匹配这个名称的测试会被运行。例如,因为上面的代码中,前两个测试的名称包含 add,则可以通过 cargo test add 来运行这两个测试: +``` +cargo test add +``` + +执行结果如下图: + +![注释](../../assets/60.png) + +## 5. 忽略某个测试 +有时候运行cargo test时想忽略其中的某个测试,此时可以通过使用ignore属性来标记该测试来排除它。例如有如下测试代码: +```Rust +pub fn add_two(a: i32) -> i32 { + a + 2 +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + #[ignore] //通过添加ignore属性来排除改测试,运行cargo test将不会执行该测试函数 + fn add_two_and_two() { + assert_eq!(4, add_two(2)); + } + + #[test] + fn add_three_and_two() { + assert_eq!(5, add_two(3)); + } + + #[test] + fn one_hundred() { + assert_eq!(102, add_two(100)); + } +} +``` +上面的代码中将add_two_and_two用#[ignore]忽略,运行cargo test将不会执行该函数,执行结果如下: + +![注释](../../assets/61.png)