Testing 如何在集成测试期间运行服务器(进程)?

Testing 如何在集成测试期间运行服务器(进程)?,testing,rust,rust-tokio,Testing,Rust,Rust Tokio,我的问题是服务器进程在最后一次集成测试后没有关闭 在integration.rs中,我有: lazy\u static!{ 静态引用服务器:Arc={ println!(“启动服务器”); Arc::new(互斥体::new( cmd!(“货物”、“运行”、“运行”、“13000”) .reader() .expect(“有效服务器”), )) }; } 异步fn等待\u服务器(){ lazy_static::初始化(&SERVER); //等待代码 } #[东京:测试] 异步fn集成\u测试\

我的问题是服务器进程在最后一次集成测试后没有关闭

integration.rs
中,我有:

lazy\u static!{
静态引用服务器:Arc={
println!(“启动服务器”);
Arc::new(互斥体::new(
cmd!(“货物”、“运行”、“运行”、“13000”)
.reader()
.expect(“有效服务器”),
))
};
}
异步fn等待\u服务器(){
lazy_static::初始化(&SERVER);
//等待代码
}
#[东京:测试]
异步fn集成\u测试\u查询\u金额()->结果{
等待服务器()。等待;
让client=reqwest::client::new();
//等等。。。
}

测试工作正常,但在
货物测试
调用完成后,服务器仍保持运行。启动和关闭这样的服务器有什么好方法吗?

你可以为一个进程做一个
Drop
包装器,当它超出范围时,这个包装器会杀死它。大致如下:

struct KillOnDrop(std::process::Child);

impl Drop for KillOnDrop {
    fn drop(&mut self) {
        self.0.kill()
    }
}

或者,由于看起来您已经在使用
tokio
tokio::process
,您可以为一个进程创建一个
Drop
包装器,当它超出范围时,该包装器将杀死它。大致如下:

struct KillOnDrop(std::process::Child);

impl Drop for KillOnDrop {
    fn drop(&mut self) {
        self.0.kill()
    }
}
或者,因为看起来您已经在使用
tokio
tokio::process