#error #error-handling #points

开发 测试结果

提供 TestResult 类型,用于简洁且精确的测试失败

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日

#102Rust 模式

Download history 2156/week @ 2024-05-04 1267/week @ 2024-05-11 1014/week @ 2024-05-18 3397/week @ 2024-05-25 3442/week @ 2024-06-01 1777/week @ 2024-06-08 1948/week @ 2024-06-15 1855/week @ 2024-06-22 1285/week @ 2024-06-29 2609/week @ 2024-07-06 2897/week @ 2024-07-13 4089/week @ 2024-07-20 2467/week @ 2024-07-27 3020/week @ 2024-08-03 2739/week @ 2024-08-10 2240/week @ 2024-08-17

每月10,803 次下载
用于 35 仓库(33 个直接使用)

MIT/Apache

13KB
72

测试结果

CI Crates.io Codecov

提供 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许可证定义提交给本项目包含的任何贡献,都将按照上述方式双重许可,不附加任何额外条款或条件。

无运行时依赖