有没有办法让调试失败,非终止,测试变得更容易?

时间:2016-10-11 12:44:37

标签: unit-testing rust rust-cargo

如果#[test]函数意外地永远循环,则测试套件无法完成。如果你杀了它(例如 ctrl - c ),cargo test似乎静默退出,所以你既没有得到堆栈跟踪(如果启用),也没有报告哪些测试通过或失败。

有没有办法让调试失败,非终止,测试变得更容易?

1 个答案:

答案 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 {}
});