websocket异步消息收发测试核心是验证真实场景下的消息正确性、响应匹配、超时异常处理;需用wscat/postman做协议与鉴权验证,编写单元测试覆盖连接超时、id关联、消息匹配,多实例压测并发与断连,监听断言onmessage执行流。

测试 WebSocket 异步消息收发,核心不是“测能不能连上”,而是验证在真实异步场景下:消息是否能正确发出、是否被准确接收、响应是否及时匹配、超时与异常是否被妥善处理。浏览器控制台远远不够,必须模拟并发、断连、延迟、乱序等边界条件。
用专用工具做基础连通性与协议级验证
先排除网络和握手问题,再谈业务逻辑:
- 用 wscat(Node.js 工具)快速验证服务端响应格式:运行
wscat -c wss://your-api.com/ws,手动发 JSON,看返回是否含req_id、字段名是否拼写一致(比如是request_id还是reqId) - 用 Postman(新版)或 Insomnia 测试带鉴权的连接:支持设置 Header(如
Authorization)、查询参数、TLS 配置,比浏览器更贴近真实客户端环境 - 避免依赖浏览器开发者工具的“Message”面板——它不显示二进制帧、不支持自定义 opcode、无法批量发送、也无法模拟连接闪断
编写可断言的单元测试,覆盖关键异步路径
对封装好的 Promise 接口(如 connect()、waitForMessage()、rpc.call())逐个验证:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 测试连接超时:mock
WebSocket构造函数,让实例永远不触发open,断言connect(url)在 5s 后 reject 并抛出"timeout" - 测试消息匹配:在
waitForMessage(ws, msg => msg.type === "PONG")中,先发一条{type: "PING"},再发{type: "PONG", data: 123},确认只 resolve 第二条且返回123 - 测试请求-响应 ID 关联:调用
rpc.call("login", {u: "a"}),检查发出的消息体是否含id字段;再用ws.onmessage模拟返回{id: "xxx", result: "ok"},断言 Promise 正确 resolve
用多实例脚本压测真实异步行为
单连接测试通过不代表线上稳定,需模拟多个客户端并发收发:
- 写一个 Node.js 脚本,用
ws库启动 20 个 WebSocket 客户端,每个独立连接、独立生成req_id、独立等待响应 - 让它们每秒随机发送
getUser或ping请求,并记录从send到收到对应result的耗时,统计 95 分位延迟、超时率、错配率 - 在压测中途主动关闭某个连接(
ws.close(1001, "test disconnect")),验证 pending 请求是否全部被 reject,Map 是否清空,无内存泄漏
监听并断言 onmessage 中的实际执行流
不要只测“发出去了”,要测“回调真被执行了”:
- 在封装的
onmessage处理器里,用console.timeLog或打点日志记录进入时间、匹配 ID、执行 callback、清理 Map 四个节点,对比时间戳确认无阻塞 - 故意传入一个会 throw 的 callback,确认外层有
try/catch包裹,且不会中断后续消息分发 - 发送两条带相同
req_id的响应(模拟服务端重复推送),确认第二条到来时 callback 不再执行,Map 中已无该 ID
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










