如何在 QuickCheck 测试中悄悄捕获恐慌?

2023-12-21

在我的测试中溢出_支持 https://crates.io/crates/overflower_support板条箱,我发现我收到了很多关于恐慌的虚假报告,这些报告已经使用std::panic::catch_unwind(_)。这有点不幸,因为它掩盖了可能发生的真正错误。这些消息看起来像:

thread 'safe' panicked at 'arithmetic overflow', src/lib.rs:56

为了平息这些分散注意力的信息,我引入了dont_panic(..)函数,它劫持恐慌处理程序,调用闭包并在完成后重置恐慌处理程序,返回闭包结果。它看起来像这样:

fn dont_panic<F, A, R>(args: A, f: F) -> R
    where F: Fn(A) -> R
{
    let p = panic::take_hook();
    panic::set_hook(Box::new(|_| ()));
    let result = f(args);
    panic::set_hook(p);
    result
}

然而,令人惊讶的是,在函数中使用此函数进行检查不仅平息了所需的消息,而且还平息了 Quickcheck 的错误输出,这对我来说显然很有价值。即使将测试限制为一个线程,也会发生这种情况。

#[test]
fn test_some_panic() {
    fn check(x: usize) -> bool {
        let expected = if x < 256 { Some(x) } else { None };
        let actual = dont_panic(|| panic::catch_unwind(|| { assert!(x < 256); x }).ok());
        expected == actual
    }
    quickcheck(check as fn(usize) -> bool);
}

如何在代码中隐藏捕获的恐慌,同时保持 QuickCheck 的恐慌可见?


默认的恐慌处理程序在 stderr 上无条件地打印恐慌信息。

你想要注册你自己的处理程序 https://doc.rust-lang.org/std/panic/fn.set_hook.html.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 QuickCheck 测试中悄悄捕获恐慌? 的相关文章

随机推荐