如何使用多个WebSocket客户端测试Warp Filter?
解决Warp测试中多客户端连接同一测试服务器的问题
你当前的代码里,每次调用handshake(get_server())都会创建一个全新的测试服务器实例,导致client1和client2实际连接的是两个不同的服务器。要让所有客户端共享同一个测试服务器,可以通过先启动一个持久化的测试服务器,再让客户端连接到这个服务器的地址来实现:
修正后的测试代码
#[tokio::test] async fn test_ws() { // 只初始化一次Filter,避免重复创建 let server_filter = get_server(); // 启动测试服务器,绑定到随机可用端口 let (addr, server) = warp::serve(server_filter) .bind_with_graceful_shutdown(([127, 0, 0, 1], 0), async { tokio::signal::ctrl_c().await.ok(); }); // 后台运行服务器,避免阻塞测试逻辑 tokio::spawn(server); // 让客户端连接到同一个服务器地址 let mut client1 = warp::test::ws() .connect(&format!("ws://{}", addr)) .await .expect("client1 handshake failed"); let mut client2 = warp::test::ws() .connect(&format!("ws://{}", addr)) .await .expect("client2 handshake failed"); // 这里可以继续编写你的测试逻辑,比如发送/接收消息验证多客户端交互 }
关键说明
bind_with_graceful_shutdown会返回服务器的绑定地址和服务器实例,用tokio::spawn把服务器放到后台异步运行,不影响后续客户端连接逻辑。- 所有客户端都通过
connect方法连接到同一个addr,确保它们访问的是同一个服务器实例。 - 只调用一次
get_server()获取Filter,避免重复初始化带来的状态不一致问题。
内容的提问来源于stack exchange,提问作者Ceres
相关产品推荐
相关产品推荐

