|
|
@@ -5,6 +5,7 @@
|
|
|
|------|------|------|------|
|
|
|
| 2.4 | 2025-09-20 | 更新测试策略与主架构文档版本一致 | Winston |
|
|
|
| 2.5 | 2025-09-24 | 更新数据库配置,修正数据库类型 | Winston |
|
|
|
+| 2.6 | 2025-09-27 | 添加移动端应用测试策略 | Winston |
|
|
|
|
|
|
## 概述
|
|
|
|
|
|
@@ -107,6 +108,9 @@ jobs:
|
|
|
- **数据库操作模块**: 必须达到85%单元测试覆盖率
|
|
|
- **核心业务逻辑**: 必须达到80%集成测试覆盖率
|
|
|
- **用户管理功能**: 必须100% E2E测试覆盖
|
|
|
+- **移动端实时通信**: 必须达到85%单元测试覆盖率
|
|
|
+- **股票训练系统**: 必须达到80%集成测试覆盖率
|
|
|
+- **音视频通信**: 必须达到75%集成测试覆盖率
|
|
|
|
|
|
## 测试数据管理
|
|
|
|
|
|
@@ -186,6 +190,45 @@ pnpm test:coverage
|
|
|
4. **重新测试** → 修复后重新运行测试
|
|
|
5. **文档更新** → 更新测试策略和案例
|
|
|
|
|
|
+## 移动端应用测试策略
|
|
|
+
|
|
|
+### 移动端特有测试要求
|
|
|
+
|
|
|
+**实时通信测试**:
|
|
|
+- **Socket.IO连接测试**: 验证WebSocket连接建立和断开
|
|
|
+- **消息传递测试**: 测试实时消息发送和接收的正确性
|
|
|
+- **事件处理测试**: 验证各种Socket事件的处理逻辑
|
|
|
+- **并发测试**: 测试多用户同时连接和交互的场景
|
|
|
+- **断线重连测试**: 验证网络异常后的自动重连机制
|
|
|
+
|
|
|
+**股票训练系统测试**:
|
|
|
+- **实时数据推送测试**: 验证股票数据的实时更新和推送
|
|
|
+- **交易执行测试**: 测试股票买卖操作的完整流程
|
|
|
+- **K线图数据测试**: 验证图表数据的正确性和实时性
|
|
|
+- **性能测试**: 测试大量实时数据推送的性能表现
|
|
|
+- **数据一致性测试**: 确保前端显示与后端数据的一致性
|
|
|
+
|
|
|
+**音视频通信测试**:
|
|
|
+- **RTC token生成测试**: 验证阿里云RTC token生成的安全性
|
|
|
+- **音视频连接测试**: 测试音视频通话的连接建立和断开
|
|
|
+- **媒体流测试**: 验证音视频流的传输质量
|
|
|
+- **权限控制测试**: 测试不同角色用户的音视频权限
|
|
|
+- **网络适应性测试**: 测试不同网络条件下的音视频质量
|
|
|
+
|
|
|
+**移动端UI/UX测试**:
|
|
|
+- **响应式设计测试**: 验证在不同屏幕尺寸下的显示效果
|
|
|
+- **触摸交互测试**: 测试触摸操作的响应性和准确性
|
|
|
+- **手势操作测试**: 验证各种手势操作的识别和处理
|
|
|
+- **离线功能测试**: 测试网络异常时的降级处理
|
|
|
+- **性能优化测试**: 验证移动端性能优化措施的有效性
|
|
|
+
|
|
|
+### 移动端测试工具
|
|
|
+- **Playwright Mobile**: 移动端E2E测试
|
|
|
+- **Socket.IO Client Testing**: Socket.IO客户端测试工具
|
|
|
+- **WebRTC Testing**: WebRTC连接和媒体流测试
|
|
|
+- **React Native Testing Library**: React组件测试
|
|
|
+- **Performance Monitoring**: 移动端性能监控工具
|
|
|
+
|
|
|
## 安全测试策略
|
|
|
|
|
|
### 安全测试要求
|
|
|
@@ -194,6 +237,12 @@ pnpm test:coverage
|
|
|
- **数据保护**: 测试敏感数据泄露风险
|
|
|
- **错误处理**: 测试错误信息是否泄露敏感数据
|
|
|
|
|
|
+### 移动端安全测试要求
|
|
|
+- **实时通信安全**: 测试Socket.IO连接的身份验证和权限控制
|
|
|
+- **音视频安全**: 测试RTC token的安全性和权限验证
|
|
|
+- **数据加密**: 测试敏感数据传输的加密保护
|
|
|
+- **移动端安全**: 测试移动端特有的安全风险(如本地存储安全)
|
|
|
+
|
|
|
### 安全测试工具
|
|
|
- **OWASP ZAP**: 自动化安全扫描
|
|
|
- **npm audit**: 依赖漏洞检查
|
|
|
@@ -207,10 +256,21 @@ pnpm test:coverage
|
|
|
- **并发用户数**: 支持100+并发用户
|
|
|
- **资源使用**: CPU < 70%, 内存 < 80%
|
|
|
|
|
|
+### 移动端性能测试要求
|
|
|
+- **实时通信延迟**: < 200ms (p95) 消息传递延迟
|
|
|
+- **股票数据推送频率**: 支持每秒10+次数据更新
|
|
|
+- **音视频延迟**: < 500ms (p95) 音视频传输延迟
|
|
|
+- **移动端渲染性能**: 页面加载时间 < 2秒
|
|
|
+- **移动端内存使用**: < 100MB 内存占用
|
|
|
+- **移动端电池消耗**: 连续使用4小时以上
|
|
|
+
|
|
|
### 性能测试工具
|
|
|
- **k6**: 负载测试
|
|
|
- **autocannon**: API性能测试
|
|
|
- **Playwright**: E2E性能监控
|
|
|
+- **Socket.IO Performance Testing**: 实时通信性能测试
|
|
|
+- **WebRTC Performance Testing**: 音视频性能测试
|
|
|
+- **Mobile Performance Monitoring**: 移动端性能监控
|
|
|
|
|
|
## 测试文档标准
|
|
|
|
|
|
@@ -243,6 +303,68 @@ describe('UserService', () => {
|
|
|
});
|
|
|
});
|
|
|
});
|
|
|
+
|
|
|
+// 移动端实时通信测试示例
|
|
|
+describe('ClassroomSocketService', () => {
|
|
|
+ describe('joinClassroom()', () => {
|
|
|
+ it('应该成功加入课堂并接收欢迎消息', async () => {
|
|
|
+ // Arrange
|
|
|
+ const classroomId = 'classroom-123';
|
|
|
+ const userId = 'user-456';
|
|
|
+
|
|
|
+ // Act
|
|
|
+ const socket = await classroomService.joinClassroom(classroomId, userId);
|
|
|
+
|
|
|
+ // Assert
|
|
|
+ await expect(socket).toReceiveMessage('welcome');
|
|
|
+ expect(socket.connected).toBe(true);
|
|
|
+ });
|
|
|
+
|
|
|
+ it('应该处理网络异常并自动重连', async () => {
|
|
|
+ // Arrange
|
|
|
+ const socket = await classroomService.joinClassroom('classroom-123', 'user-456');
|
|
|
+
|
|
|
+ // Act
|
|
|
+ socket.disconnect(); // 模拟网络断开
|
|
|
+ await waitForReconnection();
|
|
|
+
|
|
|
+ // Assert
|
|
|
+ expect(socket.connected).toBe(true);
|
|
|
+ });
|
|
|
+ });
|
|
|
+});
|
|
|
+
|
|
|
+// 股票训练系统测试示例
|
|
|
+describe('StockTrainingService', () => {
|
|
|
+ describe('subscribeStockData()', () => {
|
|
|
+ it('应该订阅股票数据并接收实时更新', async () => {
|
|
|
+ // Arrange
|
|
|
+ const stockCode = 'AAPL';
|
|
|
+
|
|
|
+ // Act
|
|
|
+ const subscription = await stockService.subscribeStockData(stockCode);
|
|
|
+
|
|
|
+ // Assert
|
|
|
+ await expect(subscription).toReceiveDataWithin(1000); // 1秒内收到数据
|
|
|
+ expect(subscription.isActive).toBe(true);
|
|
|
+ });
|
|
|
+
|
|
|
+ it('应该处理高频数据推送的性能', async () => {
|
|
|
+ // Arrange
|
|
|
+ const stockCodes = ['AAPL', 'GOOGL', 'TSLA', 'MSFT'];
|
|
|
+
|
|
|
+ // Act
|
|
|
+ const startTime = Date.now();
|
|
|
+ const subscriptions = await Promise.all(
|
|
|
+ stockCodes.map(code => stockService.subscribeStockData(code))
|
|
|
+ );
|
|
|
+
|
|
|
+ // Assert
|
|
|
+ const duration = Date.now() - startTime;
|
|
|
+ expect(duration).toBeLessThan(500); // 500ms内完成所有订阅
|
|
|
+ });
|
|
|
+ });
|
|
|
+});
|
|
|
```
|
|
|
|
|
|
### 测试命名约定
|