有没有一种方法可以更轻松地调试失败的、非终止的测试?

Is there a way to make it easier to debug failing, non-terminating, tests?

如果 #[test] 函数不小心永远循环,则测试套件不会完成。如果你杀死它(例如 ctrl-c),cargo test 似乎会静静地退出,所以你既不会得到堆栈跟踪(如果已启用)或测试通过或失败的报告。

有没有一种方法可以更轻松地调试失败的、非终止的测试?

我遇到了 timebomb,它看起来接近我需要的,但确实意味着手动包装每个测试;即代替:

#[test]
fn test() {
    assert!(true);
}

我需要做的:

extern crate timebomb;
use timebomb::timeout_ms;

#[test]
fn test() {
    timeout_ms(|| {
        assert!(true);
    }, 1000);
}

这对许多测试来说是一种痛苦(但不可否认是一次性的)。 可是等等; Rust 有宏!这实际上似乎是一个合理的解决方案:

extern crate timebomb;
use timebomb::timeout_ms;

macro_rules! timeout_test {
    ( $name:ident() $code:block ) => {
        #[test]
        fn $name() {
            timeout_ms(|| $code, 1000);
        }
    }
}

// the hard way
#[test]
fn foo() {
    timeout_ms(|| {
        loop {}
    }, 1000);
}

// the now easy way
timeout_test!(bar() {
   loop {}
});