测试与调试
wscat、集成测试要点。
25 分钟
测试与调试
WebSocket 调试分 协议层(wscat、DevTools)与 集成层(Spring Test + STOMP 客户端)。与 sb-test 互补。
学习目标
- 用 wscat / websocat 手动握手发帧
- 写 Spring Boot WebSocket 集成测试
- 定位 Nginx Upgrade 与鉴权失败
命令行工具
# npm i -g wscat
wscat -c ws://localhost:8080/ws/lab
# 发 STOMP CONNECT(简化示例)
CONNECT
accept-version:1.2
host:localhost
^@
生产路径经 Nginx:wscat -c wss://coderoadmap.local/ws --header "Cookie: satoken=..."
Spring 集成测试
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
class StompChatIntegrationTest {
@LocalServerPort int port;
WebSocketStompClient stompClient;
@BeforeEach
void setup() {
stompClient = new WebSocketStompClient(new StandardWebSocketClient());
stompClient.setMessageConverter(new MappingJackson2MessageConverter());
}
@Test
void shouldBroadcastChatMessage() throws Exception {
StompSession session = stompClient.connectAsync(
"ws://localhost:" + port + "/ws", new StompSessionHandlerAdapter() {})
.get(5, TimeUnit.SECONDS);
// subscribe + send + assert
}
}
MockMvc 不支持 WS;需 WebSocketStompClient 或 Testcontainers 全栈。
常见问题
| 现象 | 可能原因 |
|---|---|
| 200 而非 101 | Nginx 缺 Upgrade(ws-nginx) |
| 403 on handshake | ws-auth token 无效 |
| 连上无消息 | 未 SUBSCRIBE 或 sessionId 不匹配 |
| 1006 频繁 | 代理超时、实例重启 |
浏览器 DevTools → Network → WS 帧面板可对照 STOMP 命令。
练习
- 用 wscat 连本地
/ws,记录 101 响应头 - 为
LabChatController写一条订阅+广播断言 - 故意去掉 Nginx Upgrade,复现失败并截图