wip: 2024 edition

pull/875/head
kazeno 3 weeks ago
parent ad593901e9
commit 36d3685755

@ -239,7 +239,7 @@ Cargo 编译并运行了测试。可以看到 `running 1 test` 这一行。下
{{#include ../listings/ch11-writing-automated-tests/no-listing-07-custom-failure-message/output.txt}}
```
可以在测试输出中看到所取得的确切的值,这会帮助我们理解真正发生了什么,而不是期望发生什么。
可以在测试输出中看到所取得的确切的值,这会帮助我们调试真正发生了什么,而不是期望发生什么。
### 使用 `should_panic` 检查 panic
@ -247,7 +247,7 @@ Cargo 编译并运行了测试。可以看到 `running 1 test` 这一行。下
可以通过对函数增加另一个属性 `should_panic` 来实现这些。这个属性在函数中的代码 panic 时会通过,而在其中的代码没有 panic 时失败。
示例 11-8 展示了一个检查 `Guess::new` 是否按照我们的期望出错的测试:
示例 11-8 展示了一个测试,检查 `Guess::new` 在错误条件下是否如我们所料那样。
<span class="filename">文件名src/lib.rs</span>
@ -285,9 +285,9 @@ Cargo 编译并运行了测试。可以看到 `running 1 test` 这一行。下
{{#rustdoc_include ../listings/ch11-writing-automated-tests/listing-11-09/src/lib.rs:here}}
```
<span class="caption">示例 11-9一个会带有特定错误信息的 `panic!` 条件的测试</span>
<span class="caption">示例 11-9一个错误信息包含特定子字符串`panic!` 条件的测试</span>
这个测试会通过,因为 `should_panic` 属性中 `expected` 参数提供的值是 `Guess::new` 函数 panic 信息的子串。我们可以指定期望的整个 panic 信息,在这个例子中是 `Guess value must be less than or equal to 100, got 200.` 。 `expected` 信息的选择取决于 panic 信息有多独特或动态,和你希望测试有多准确。在这个例子中,错误信息的子字符串足以确保函数在 `else if value > 100` 的情况下运行。
这个测试会通过,因为 `should_panic` 属性中 `expected` 参数提供的值是 `Guess::new` 函数 panic 信息的子串。我们可以指定期望的整个 panic 信息,在这个例子中是 `Guess value must be less than or equal to 100, got 200` 。信息的选择取决于 panic 信息有多独特或动态,和你希望测试有多准确。在这个例子中,错误信息的子字符串足以确保函数在 `else if value > 100` 的情况下运行。
为了观察带有 `expected` 信息的 `should_panic` 测试失败时会发生什么,让我们再次引入一个 bug`if value < 1``else if value > 100` 的代码块对换:
@ -301,21 +301,21 @@ Cargo 编译并运行了测试。可以看到 `running 1 test` 这一行。下
{{#include ../listings/ch11-writing-automated-tests/no-listing-09-guess-with-panic-msg-bug/output.txt}}
```
失败信息表明测试确实如期望 panic 了,不过 panic 信息中并没有包含 `expected` 信息 `less than or equal to 100`。而我们得到的 panic 信息是 `Guess value must be greater than or equal to 1, got 200.`。这样就可以开始寻找 bug 在哪了!
失败信息表明测试确实如期望 panic 了,不过 panic 信息中并没有包含期望的信息 `less than or equal to 100`。而我们得到的 panic 信息是 `Guess value must be greater than or equal to 1, got 200.`。这样就可以开始寻找 bug 在哪了!
### `Result<T, E>` 用于测试
### 在测试中使用 `Result<T, E>`
目前为止,我们编写的测试在失败时都会 panic。我们也可以使用 `Result<T, E>` 编写测试!这是一个延伸自示例 11-1 的测试,使用 `Result<T, E>` 重写,并在失败时返回 `Err` 而非 panic
```rust,noplayground
{{#rustdoc_include ../listings/ch11-writing-automated-tests/no-listing-10-result-in-tests/src/lib.rs}}
{{#rustdoc_include ../listings/ch11-writing-automated-tests/no-listing-10-result-in-tests/src/lib.rs:here}}
```
现在 `it_works` 函数的返回值类型为 `Result<(), String>`。在函数体中,不同于调用 `assert_eq!` 宏,而是在测试通过时返回 `Ok(())`,在测试失败时返回带有 `String``Err`
这样编写测试来返回 `Result<T, E>` 就可以在函数体中使用问号运算符,如此可以方便的编写任何运算符会返回 `Err` 成员的测试。
不能对这些使用 `Result<T, E>` 的测试使用 `#[should_panic]` 注解。为了断言一个操作返回 `Err` 成员,_不要_ `Result<T, E>` 值使用问号表达式(`?`)。而是使用 `assert!(value.is_err())`
不能对这些使用 `Result<T, E>` 的测试使用 `#[should_panic]` 注解。为了断言一个操作返回 `Err` 成员,**不要**`Result<T, E>` 值使用问号表达式(`?`)。而是使用 `assert!(value.is_err())`
现在你知道了几种编写测试的方法,让我们看看运行测试时会发生什么,以及可以用于 `cargo test` 的不同选项。

@ -1,14 +1,16 @@
## 控制测试如何运行
> [ch11-02-running-tests.md](https://github.com/rust-lang/book/blob/main/src/ch11-02-running-tests.md)
> <br>
> commit 34314c10f699cc882d4e0b06f2a24bd37a5435f2
<!-- https://github.com/rust-lang/book/blob/main/src/ch11-02-running-tests.md -->
<!-- commit 3a30e4c1fbe641afc066b3af9eb01dcdf5ed8b24 -->
就像 `cargo run` 会编译代码并运行生成的二进制文件一样,`cargo test` 在测试模式下编译代码并运行生成的测试二进制文件。`cargo test` 产生的二进制文件的默认行为是并发运行所有的测试,并截获测试运行过程中产生的输出,阻止它们被显示出来,使得阅读测试结果相关的内容变得更容易。不过可以指定命令行参数来改变 `cargo test` 的默认行为。
可以将一部分命令行参数传递给 `cargo test`,而将另外一部分传递给生成的测试二进制文件。为了分隔这两种参数,需要先列出传递给 `cargo test` 的参数,接着是分隔符 `--`,再之后是传递给测试二进制文件的参数。运行 `cargo test --help` 会提示 `cargo test` 的有关参数,而运行 `cargo test -- --help` 可以提示在分隔符之后使用的有关参数。
可以将一部分命令行参数传递给 `cargo test`,而将另外一部分传递给生成的测试二进制文件。为了分隔这两种参数,需要先列出传递给 `cargo test` 的参数,接着是分隔符 `--`,再之后是传递给测试二进制文件的参数。运行 `cargo test --help` 会提示 `cargo test` 的有关参数,而运行 `cargo test -- --help` 可以提示在分隔符之后使用的有关参数。有关这些选项的说明,请参阅 [the rustc book][rustc] 的 [“Tests” 一节][tests]。
### 并行或连续的运行测试
[tests]: https://doc.rust-lang.org/rustc/tests/index.html
[rustc]: https://doc.rust-lang.org/rustc/index.html
### 并行或顺序运行测试
当运行多个测试时Rust 默认使用线程来并行运行。这意味着测试会更快地运行完毕,所以你可以更快的得到代码能否工作的反馈。因为测试是在同时运行的,你应该确保测试不能相互依赖,或依赖任何共享的状态,包括依赖共享的环境,比如当前工作目录或者环境变量。
@ -24,7 +26,7 @@ $ cargo test -- --test-threads=1
### 显示函数输出
默认情况下当测试通过时Rust 的测试库会获打印到标准输出的所有内容。比如在测试中调用了 `println!` 而测试通过了,我们将不会在终端看到 `println!` 的输出:只会看到说明测试通过的提示行。如果测试失败了,则会看到所有标准输出和其他错误信息。
默认情况下当测试通过时Rust 的测试库会获打印到标准输出的所有内容。比如在测试中调用了 `println!` 而测试通过了,我们将不会在终端看到 `println!` 的输出:只会看到说明测试通过的提示行。如果测试失败了,则会看到所有标准输出和其他错误信息。
例如,示例 11-10 有一个无意义的函数,它打印出其参数的值并接着返回 10。接着还有一个会通过的测试和一个会失败的测试

Loading…
Cancel
Save