gpt4 book ai didi

unit-testing - 有没有办法在给定的时间后使单元/集成测试失败?

转载 作者:行者123 更新时间:2023-12-04 11:34:52 29 4
gpt4 key购买 nike

我正在 Rust 中实现一个虚拟机作为练习。一些集成测试在该虚拟机上运行小程序并对最终结果做出断言。
但是,可能会发生错误导致机器陷入无限循环,这意味着 cargo test永远不会结束。
有没有办法在给定的时间后使单元/集成测试失败?也许类似于 #[should_panic] ,而是说,#[time_limit(500)] ?

最佳答案

ntest crate 及其 #[timeout(<ms>)] SirDarius 在评论中提到的宏可能是比以下更简单的解决方案。
作为替代方案,有一个 crate 允许创建运行闭包的进程,它具有一些与测试相关的功能。进程与线程不同,如果运行时间过长,可能会被杀死。
crate procspawn具有此关闭功能,以及一些其他不错的功能,可用于需要超时的测试。这些功能的另一个功能是对子进程中调用的代码的返回值进行序列化。测试代码可以取回结果并以非常简单的方式进行检查。
要测试的代码:

use std::thread;
use std::time::Duration;

fn runs_long() -> i32
{
thread::sleep(Duration::from_millis(5000));
42
}
在同一个文件中,我们可以添加一些带有超时的测试:
#[cfg(test)]
mod tests {
use std::time::Duration;
use procspawn;

use crate::*;

procspawn::enable_test_support!();

#[test]
fn runs_long_passes()
{
let handle = procspawn::spawn((), |_| runs_long());

match handle.join_timeout(Duration::from_millis(6000)) {
Ok(result) => assert_eq!(result, 42),
Err(e) => panic!("{}", e),
}
}

#[test]
fn runs_long_fails()
{
let handle = procspawn::spawn((), |_| runs_long());

match handle.join_timeout(Duration::from_millis(1000)) {
Ok(result) => assert_eq!(result, 42),
Err(e) => panic!("{}", e),
}
}
}
并使用 cargo test 运行测试在命令行上,我们得到:
running 3 tests
test tests::procspawn_test_helper ... ok
test tests::runs_long_fails ... FAILED
test tests::runs_long_passes ... ok

failures:

---- tests::runs_long_fails stdout ----
thread 'tests::runs_long_fails' panicked at 'process spawn error: timed out', src/main.rs:50:17
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace


failures:
tests::runs_long_fails

test result: FAILED. 2 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 6.01s

error: test failed, to rerun pass '--bin procspawn'
要启用测试支持功能,请在 Cargo.toml 文件中包含以下内容:
[dependencies]
procspawn = { version = "0.10", features = ["test-support"] }

关于unit-testing - 有没有办法在给定的时间后使单元/集成测试失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68596792/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com