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

Chr*_*son 3 unit-testing rust rust-cargo

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

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

Chr*_*son 8

我遇到过看起来像我需要的时间炸弹,但确实意味着手动包装每一个测试; 即代替:

#[test]
fn test() {
    assert!(true);
}
Run Code Online (Sandbox Code Playgroud)

我需要去做:

extern crate timebomb;
use timebomb::timeout_ms;

#[test]
fn test() {
    timeout_ms(|| {
        assert!(true);
    }, 1000);
}
Run Code Online (Sandbox Code Playgroud)

对于数十项测试来说,这是一种痛苦(但不可否认的是一次性).可是等等; 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 {}
});
Run Code Online (Sandbox Code Playgroud)