5 个版本 (3 个破坏性更新)
0.4.1 | 2024年7月22日 |
---|---|
0.4.0 | 2024年3月14日 |
0.3.0 | 2023年2月2日 |
0.2.0 | 2023年1月10日 |
0.1.0 | 2022年10月12日 |
#102 在 Rust 模式
每月10,803 次下载
用于 35 个 仓库(33 个直接使用)
13KB
72 行
测试结果
提供 TestResult
类型,可用于测试以避免 unwrap
,同时又能拥有清晰的堆栈跟踪,失败点明确。
就像测试用的精简版 anyhow
!
详细信息
考虑以下代码。它使用 unwrap
,因此测试失败的堆栈跟踪将是有信息的。不幸的是,它并不像它本可以那么简洁
#[test]
fn it_works() {
// ...
std::fs::File::open("this-file-does-not-exist").unwrap();
// ...
}
此代码的改进版本使用 Result
和 ?
操作符
#[test]
fn it_works() -> Result<(), Box<dyn std::error::Error>> {
// ...
std::fs::File::open("this-file-does-not-exist")?;
// ...
Ok(())
}
使用 RUST_BACKTRACE=1 cargo test
运行以下代码将显示以下堆栈跟踪
---- tests::it_works stdout ----
thread 'tests::it_works' panicked at 'assertion failed: `(left == right)`
left: `1`,
...
4: test::assert_test_result
at /rustc/4b91a6ea7258a947e59c6522cd5898e7c0a6a88f/library/test/src/lib.rs:184:5
5: testresult::tests::it_works::{{closure}}
at ./src/lib.rs:52:5
6: core::ops::function::FnOnce::call_once
at /rustc/4b91a6ea7258a947e59c6522cd5898e7c0a6a88f/library/core/src/ops/function.rs:248:5
...
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
不幸的是,尽管记录了测试函数的位置,但在回溯中并没有显示测试失败的确切行。
让我们调整测试结果类型以使用 TestResult
。这与前一个示例相比只有一个变化
#[test]
fn it_works() -> TestResult {
// ...
std::fs::File::open("this-file-does-not-exist")?;
// ...
Ok(())
}
再次使用 cargo test
运行它将显示更多细节
---- tests::it_works stdout ----
thread 'tests::it_works' panicked at 'error: std::io::error::Error - No such file or directory (os error 2)', src/lib.rs:53:9
请注意,错误位置现在在回溯中,也在测试失败消息中。这意味着我们甚至不需要回溯就能知道错误发生的位置。
使用 TestResult
的优点
- 确切的失败行出现在测试失败和回溯中
- 底层错误类型和消息出现在测试失败中
- 测试结果的签名更简单
更详细的描述请见 "Improving failure messages in Rust tests returning a Result"。
许可证
本项目许可协议如下之一
任选其一。
贡献
除非您明确声明,否则您根据Apache-2.0许可证定义提交给本项目包含的任何贡献,都将按照上述方式双重许可,不附加任何额外条款或条件。