# SignalR 实时通讯测试指南 **测试日期**: 2026-01-14 **功能状态**: ✅ 已实现 --- ## 一、测试前准备 ### 1.1 环境要求 - ✅ 后端服务已启动(ASP.NET Core 8.0) - ✅ 数据库已配置(SQL Server) - ✅ 小程序开发工具已安装 - ✅ 至少准备 2 个测试账号 ### 1.2 配置检查 #### 后端配置 ```bash # 检查 Program.cs 是否包含以下配置 builder.Services.AddSignalR(); app.MapHub("/hubs/chat"); ``` #### 前端配置 ```javascript // miniapp/config/index.js // 确认 API_BASE_URL 配置正确 API_BASE_URL: 'http://localhost:5000/api/app' // 开发环境 ``` --- ## 二、功能测试清单 ### 2.1 连接测试 ✅ **测试步骤**: 1. 打开小程序,登录账号 A 2. 进入任意聊天页面 3. 查看控制台日志 **预期结果**: ``` [SignalR] 正在连接: ws://localhost:5000/hubs/chat [SignalR] WebSocket 连接已打开 [SignalR] 握手成功 [Chat] SignalR 连接成功 [SignalR] 已加入会话: 123 ``` **验证点**: - [ ] WebSocket 连接成功 - [ ] 握手成功 - [ ] 加入会话成功 - [ ] 无错误日志 --- ### 2.2 实时消息推送测试 ✅ **测试步骤**: 1. 账号 A 和账号 B 分别登录小程序 2. 账号 A 进入与账号 B 的聊天页面 3. 账号 B 进入与账号 A 的聊天页面 4. 账号 A 发送文本消息:"你好" 5. 观察账号 B 的聊天页面 **预期结果**: - 账号 B **无需刷新**,立即看到账号 A 发送的消息 - 消息显示在聊天列表底部 - 页面自动滚动到底部 **控制台日志**: ``` # 账号 A 发送消息 [Chat] 发送消息: 你好 # 账号 B 接收消息 [Chat] 收到新消息: { messageId: 123, content: "你好", ... } ``` **验证点**: - [ ] 消息实时推送(无需刷新) - [ ] 消息内容正确 - [ ] 消息顺序正确 - [ ] 发送者信息正确 - [ ] 时间戳正确 --- ### 2.3 交换微信请求测试 ✅ **测试步骤**: 1. 账号 A 和账号 B 保持在聊天页面 2. 账号 A 点击"交换微信"按钮 3. 观察账号 B 的聊天页面 **预期结果**: - 账号 B **立即**看到交换微信请求卡片 - 卡片显示"对方想和您交换微信" - 显示"同意"和"拒绝"按钮 **控制台日志**: ``` # 账号 A [Chat] 发送交换微信请求 # 账号 B [Chat] 收到新消息: { messageType: 4, content: "请求交换微信", ... } ``` **验证点**: - [ ] 请求实时推送 - [ ] 卡片样式正确 - [ ] 按钮可点击 - [ ] 状态显示正确 --- ### 2.4 交换响应测试 ✅ **测试步骤**: 1. 接上一步,账号 B 点击"同意"按钮 2. 观察账号 A 的聊天页面 **预期结果**: - 账号 A **立即**看到交换结果 - 原请求卡片状态更新为"已接受" - 显示账号 B 的微信号 - 显示"点击复制微信号"按钮 **控制台日志**: ``` # 账号 B [Chat] 响应交换请求: accept=true # 账号 A [Chat] 收到交换响应: { status: 1, exchangedContent: "wechat123", ... } ``` **验证点**: - [ ] 响应实时推送 - [ ] 状态更新正确 - [ ] 微信号显示正确 - [ ] 复制功能正常 --- ### 2.5 断线重连测试 ✅ **测试步骤**: 1. 账号 A 保持在聊天页面 2. 关闭后端服务(模拟断线) 3. 等待 5 秒 4. 重新启动后端服务 5. 观察控制台日志 **预期结果**: - 检测到连接断开 - 自动尝试重连(指数退避) - 重连成功后恢复正常 **控制台日志**: ``` [SignalR] WebSocket 连接已关闭 [SignalR] 1000ms 后尝试重连 (1/5) [SignalR] 正在连接: ws://localhost:5000/hubs/chat [SignalR] 握手成功 [Chat] SignalR 连接成功 ``` **验证点**: - [ ] 检测到断线 - [ ] 自动重连 - [ ] 重连成功 - [ ] 功能恢复正常 - [ ] 最多重连 5 次 --- ### 2.6 心跳检测测试 ✅ **测试步骤**: 1. 账号 A 保持在聊天页面 2. 保持连接 30 秒以上 3. 观察控制台日志(需要开启详细日志) **预期结果**: - 每 15 秒发送一次 Ping - 收到服务端 Pong 响应 **控制台日志**: ``` [SignalR] 发送 Ping [SignalR] 收到 Pong ``` **验证点**: - [ ] 定时发送心跳 - [ ] 收到心跳响应 - [ ] 连接保持活跃 --- ### 2.7 多设备同时在线测试 ✅ **测试步骤**: 1. 账号 A 在设备 1 登录并进入聊天页面 2. 账号 A 在设备 2 登录并进入同一聊天页面 3. 账号 B 发送消息 4. 观察两个设备 **预期结果**: - 设备 1 和设备 2 **同时**收到消息 - 消息内容一致 - 无重复消息 **验证点**: - [ ] 多设备同时接收 - [ ] 消息不重复 - [ ] 消息顺序一致 --- ### 2.8 会话隔离测试 ✅ **测试步骤**: 1. 账号 A 与账号 B 聊天(会话 1) 2. 账号 A 与账号 C 聊天(会话 2) 3. 账号 B 发送消息 4. 观察会话 2 页面 **预期结果**: - 会话 2 **不会**收到会话 1 的消息 - 消息只推送到对应会话 **验证点**: - [ ] 会话隔离正确 - [ ] 消息不串台 - [ ] 推送目标准确 --- ## 三、性能测试 ### 3.1 消息延迟测试 **测试方法**: 1. 账号 A 发送消息,记录时间戳 T1 2. 账号 B 收到消息,记录时间戳 T2 3. 计算延迟:T2 - T1 **预期结果**: - 局域网:< 100ms - 公网:< 500ms **验证点**: - [ ] 延迟在可接受范围内 - [ ] 无明显卡顿 --- ### 3.2 并发消息测试 **测试方法**: 1. 账号 A 快速连续发送 10 条消息 2. 观察账号 B 接收情况 **预期结果**: - 所有消息都能收到 - 消息顺序正确 - 无消息丢失 **验证点**: - [ ] 消息完整性 - [ ] 消息顺序性 - [ ] 无丢失无重复 --- ## 四、异常场景测试 ### 4.1 网络切换测试 **测试步骤**: 1. 账号 A 使用 WiFi 连接 2. 切换到 4G 网络 3. 观察连接状态 **预期结果**: - 检测到网络切换 - 自动重连 - 功能恢复正常 --- ### 4.2 后台切换测试 **测试步骤**: 1. 账号 A 在聊天页面 2. 切换到后台(Home 键) 3. 等待 30 秒 4. 切换回前台 **预期结果**: - 连接可能断开 - 返回前台后自动重连 - 拉取离线消息 --- ### 4.3 Token 过期测试 **测试步骤**: 1. 账号 A 保持在线 2. 等待 Token 过期(或手动修改 Token) 3. 观察连接状态 **预期结果**: - 连接断开 - 提示需要重新登录 - 不会无限重连 --- ## 五、常见问题排查 ### 5.1 连接失败 **可能原因**: - 后端服务未启动 - WebSocket 端口被占用 - Token 无效或过期 - CORS 配置错误 **排查步骤**: 1. 检查后端服务是否运行 2. 检查 WebSocket URL 是否正确 3. 检查 Token 是否有效 4. 查看后端日志 --- ### 5.2 消息收不到 **可能原因**: - SignalR 未连接 - 会话 ID 不匹配 - 事件监听未注册 - 消息被过滤 **排查步骤**: 1. 检查 `signalR.connected` 状态 2. 检查 `sessionId` 是否正确 3. 检查事件监听是否注册 4. 查看控制台日志 --- ### 5.3 重连失败 **可能原因**: - 网络完全断开 - 后端服务未恢复 - 重连次数超限 **排查步骤**: 1. 检查网络连接 2. 检查后端服务状态 3. 手动调用 `signalR.reconnect()` --- ## 六、测试报告模板 ### 测试环境 - 后端版本: ASP.NET Core 8.0 - 前端版本: uni-app - 测试时间: YYYY-MM-DD - 测试人员: [姓名] ### 测试结果 | 测试项 | 状态 | 备注 | |--------|------|------| | 连接测试 | ✅ / ❌ | | | 实时消息推送 | ✅ / ❌ | | | 交换微信请求 | ✅ / ❌ | | | 交换响应 | ✅ / ❌ | | | 断线重连 | ✅ / ❌ | | | 心跳检测 | ✅ / ❌ | | | 多设备在线 | ✅ / ❌ | | | 会话隔离 | ✅ / ❌ | | ### 发现的问题 1. [问题描述] 2. [问题描述] ### 改进建议 1. [建议内容] 2. [建议内容] --- ## 七、生产环境部署检查 ### 7.1 服务器配置 **Nginx 配置**(WebSocket 支持): ```nginx location /hubs/chat { proxy_pass http://localhost:5000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; proxy_read_timeout 86400; } ``` **检查项**: - [ ] WebSocket 支持已启用 - [ ] 超时时间配置合理 - [ ] SSL 证书已配置(wss://) - [ ] 防火墙规则已配置 --- ### 7.2 监控告警 **监控指标**: - SignalR 连接数 - 消息推送成功率 - 平均消息延迟 - 重连次数 **告警规则**: - 连接数异常增长 - 推送失败率 > 5% - 平均延迟 > 1s - 重连次数 > 100/分钟 --- ## 八、总结 SignalR 实时通讯功能已完整实现,包括: - ✅ 实时消息推送 - ✅ 断线重连机制 - ✅ 心跳检测 - ✅ 会话隔离 - ✅ 多设备支持 建议在生产环境部署前完成所有测试项,确保功能稳定可靠。