如果 #[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 {}
});
关于unit-testing - 有没有一种方法可以更轻松地调试失败的、非终止的测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39977556/