运行“cargo test”时是否可以使用自定义“#[panic_handler]”?

问题描述 投票:0回答:1

我在 Rust 项目中有一些基于运行单个文件的单元测试。如果由于某种原因程序正常失败,我的测试基础设施将打印出有关失败的一些详细信息(例如文件名和其他测试参数)。

我希望这种情况发生在程序不正常终止(又称为恐慌)时。我知道并使用 Rust

#[panic_handler]
功能。但是,我不确定它是否会干扰其他可能不需要此恐慌处理程序的测试,以及是否会干扰实际的测试基础设施(例如,它是否会破坏诸如
should_panic
之类的东西)。

对这个问题有什么想法吗?

我正在为每个测试尝试

#[panic_handler]
功能,但我不确定它有多“正确”。

rust rust-cargo
1个回答
1
投票

#[panic_handler]
对于这项工作来说有点过分了。

如果您想打印所有恐慌的附加信息而不执行其他操作,可以使用恐慌hook,由

std::panic::set_hook()
控制。与恐慌处理程序的区别在于,恐慌挂钩可能会返回,继续展开或中止 - 它只控制恐慌后立即发生的事情,而不是控制之后的流程。

更窄的是

catch_unwind()
。您可以从每个单独的测试中调用它(它是堆栈范围的而不是全局的),并且不是在 before 展开之前进行干预(如恐慌处理程序和恐慌钩子所做的那样),它会停止展开(然后您可以使用
 恢复) resume_unwind()
以便实际记录测试失败)。
catch_unwind()
的优点是,由于您从测试代码内部调用它,因此您可以轻松地使用该特定测试用例中的信息。

catch_unwind()
仅在代码使用
panic = unwind
而不是
panic = abort
编译时才有效,但这是默认设置,因为这是你的测试,而不是库,所以没有理由将其更改为在你下面。)

© www.soinside.com 2019 - 2024. All rights reserved.