我的问题是上次集成测试后服务器进程没有关闭。
在integration.rs
中,我有:
lazy_static! {
static ref SERVER: Arc<Mutex<duct::ReaderHandle>> = {
println!("Starting server");
Arc::new(Mutex::new(
cmd!("cargo", "run", "--", "13000")
.reader()
.expect("Valid server"),
))
};
}
async fn wait_for_server() {
lazy_static::initialize(&SERVER);
// Code to wait
}
#[tokio::test]
async fn integration_test_query_amount() -> Result<()> {
wait_for_server().await;
let client = reqwest::Client::new();
// Etc...
}
测试正常,但是在cargo test
调用完成之后服务器保持运行。是否有一个不错的方法来启动并关闭这样的服务器?
答案 0 :(得分:2)
您可以为进程创建Drop
包装器,当其超出范围时将杀死该包装器。类似于:
struct KillOnDrop(std::process::Child);
impl Drop for KillOnDrop {
fn drop(&mut self) {
self.0.kill()
}
}
或者,看起来您已经在使用tokio
tokio::process
supports this out of the box。