如果#[test]
函数意外地永远循环,则测试套件无法完成。如果你杀了它(例如 ctrl - c ),cargo test
似乎静默退出,所以你既没有得到堆栈跟踪(如果启用),也没有报告哪些测试通过或失败。
有没有办法让调试失败,非终止,测试变得更容易?
答案 0 :(得分:8)
我遇到了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 {}
});