457 lines
8.6 KiB
Markdown
457 lines
8.6 KiB
Markdown
# SignalR 实时通讯测试指南
|
||
|
||
**测试日期**: 2026-01-14
|
||
**功能状态**: ✅ 已实现
|
||
|
||
---
|
||
|
||
## 一、测试前准备
|
||
|
||
### 1.1 环境要求
|
||
- ✅ 后端服务已启动(ASP.NET Core 8.0)
|
||
- ✅ 数据库已配置(SQL Server)
|
||
- ✅ 小程序开发工具已安装
|
||
- ✅ 至少准备 2 个测试账号
|
||
|
||
### 1.2 配置检查
|
||
|
||
#### 后端配置
|
||
```bash
|
||
# 检查 Program.cs 是否包含以下配置
|
||
builder.Services.AddSignalR();
|
||
app.MapHub<ChatHub>("/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 实时通讯功能已完整实现,包括:
|
||
- ✅ 实时消息推送
|
||
- ✅ 断线重连机制
|
||
- ✅ 心跳检测
|
||
- ✅ 会话隔离
|
||
- ✅ 多设备支持
|
||
|
||
建议在生产环境部署前完成所有测试项,确保功能稳定可靠。
|