如何对基于Tonic框架的Rust gRPC应用编写集成测试
Rust tonic 框架 gRPC 集成测试实现方案
前置依赖调整
首先在你的Cargo.toml中补充测试所需的依赖配置:
[package] name = "merchant-app" # 此处为你的项目名,后续导入会用到 version = "0.1.0" edition = "2021" [dependencies] tonic = "0.9" prost = "0.12" tokio = { version = "1.0", features = ["full"] } async-trait = "0.1" [build-dependencies] tonic-build = "0.9" [dev-dependencies] tonic = "0.9" tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] }
注意:你贴出的代码存在文件内容错位问题,
merchant.rs里放了启动入口的main函数,main.rs里反而放了服务实现,建议先把两个文件的内容交换,符合常规Rust项目结构,避免后续导入路径报错。
merchant_test.rs 完整代码
// 导入主项目的类型,merchant_app替换为你Cargo.toml中package.name的取值 use merchant_app::merchant::merchant_service_client::MerchantServiceClient; use merchant_app::merchant::MerchantServiceImpl; use merchant_app::merchant::Merchant; use tonic::transport::Server; #[tokio::test] async fn test_add_merchant() { // 绑定随机端口,避免多测试并行时端口冲突 let addr = "127.0.0.1:0".parse().unwrap(); let merchant_service = MerchantServiceImpl::default(); // 把服务放到后台异步任务运行,不阻塞测试线程 tokio::spawn(async move { Server::builder() .add_service( merchant_app::merchant::merchant_service_server::MerchantServiceServer::new(merchant_service) ) .serve(addr) .await .unwrap(); }); // 等待服务启动完成,也可以自行实现循环重试连接逻辑替代固定休眠,稳定性更高 tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; // 初始化gRPC客户端 let mut client = MerchantServiceClient::connect(format!("http://{}", addr)) .await .unwrap(); // 构造请求调用接口 let request = tonic::Request::new(Merchant { name: "test_merchant".to_string(), }); let response = client.add_merchant(request).await.unwrap(); let response_merchant = response.into_inner(); // 校验返回值,和你当前实现的固定返回"name"逻辑匹配 assert_eq!(response_merchant.name, "name".to_string()); // 后续如果调整实现为返回请求传入的name,可替换为下面的断言 // assert_eq!(response_merchant.name, "test_merchant".to_string()); }
执行测试
直接运行cargo test即可执行该集成测试。
内容的提问来源于stack exchange,提问作者user1048282
相关产品推荐
相关产品推荐

