|
|
@@ -0,0 +1,314 @@
|
|
|
+# 测试策略
|
|
|
+
|
|
|
+## 测试框架和工具
|
|
|
+
|
|
|
+### 单元测试
|
|
|
+
|
|
|
+**Vitest 3.2.4**
|
|
|
+
|
|
|
+- 快速的测试运行器,专为Vite优化
|
|
|
+- 支持TypeScript和ES模块
|
|
|
+- 内置代码覆盖率报告
|
|
|
+- 快照测试支持
|
|
|
+
|
|
|
+**Testing Library 16.3.0**
|
|
|
+
|
|
|
+- React Testing Library: 组件测试
|
|
|
+- DOM Testing Library: DOM操作测试
|
|
|
+- 用户行为导向的测试方法
|
|
|
+
|
|
|
+### 端到端测试
|
|
|
+
|
|
|
+**Playwright 1.55.0**
|
|
|
+
|
|
|
+- 跨浏览器自动化测试
|
|
|
+- 支持Chromium、Firefox、WebKit
|
|
|
+- 自动等待和断言
|
|
|
+- 截图和视频录制
|
|
|
+
|
|
|
+### 测试脚本配置
|
|
|
+
|
|
|
+```json
|
|
|
+{
|
|
|
+ "scripts": {
|
|
|
+ "test": "vitest",
|
|
|
+ "test:coverage": "vitest --coverage",
|
|
|
+ "test:e2e": "playwright test",
|
|
|
+ "test:e2e:chromium": "playwright test --project=chromium",
|
|
|
+ "test:e2e:headed": "playwright test --headed"
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+## 测试层级结构
|
|
|
+
|
|
|
+### 单元测试 (Unit Tests)
|
|
|
+
|
|
|
+**测试范围**
|
|
|
+
|
|
|
+- 工具函数 (`src/common/utils.ts`)
|
|
|
+- 自定义Hooks (`src/common/hooks.ts`)
|
|
|
+- 管理器类 (`src/manager/`)
|
|
|
+- 工具类和方法
|
|
|
+
|
|
|
+**测试位置**
|
|
|
+
|
|
|
+```
|
|
|
+src/
|
|
|
+├── common/
|
|
|
+│ └── __tests__/
|
|
|
+│ └── utils.test.ts
|
|
|
+├── manager/
|
|
|
+│ └── __tests__/
|
|
|
+│ ├── rtc.test.ts
|
|
|
+│ ├── rtm.test.ts
|
|
|
+│ └── stt.test.ts
|
|
|
+└── components/
|
|
|
+ └── __tests__/
|
|
|
+ └── *.test.tsx
|
|
|
+```
|
|
|
+
|
|
|
+### 集成测试 (Integration Tests)
|
|
|
+
|
|
|
+**测试范围**
|
|
|
+
|
|
|
+- 组件与状态管理的集成
|
|
|
+- 管理器间的协作
|
|
|
+- API调用和响应处理
|
|
|
+- 事件系统集成
|
|
|
+
|
|
|
+**测试位置**
|
|
|
+
|
|
|
+```
|
|
|
+tests/
|
|
|
+├── integration/
|
|
|
+│ ├── store-integration.test.ts
|
|
|
+│ ├── manager-integration.test.ts
|
|
|
+│ └── api-integration.test.ts
|
|
|
+└── __mocks__/
|
|
|
+ └── agora-mocks.ts
|
|
|
+```
|
|
|
+
|
|
|
+### 端到端测试 (E2E Tests)
|
|
|
+
|
|
|
+**测试范围**
|
|
|
+
|
|
|
+- 完整的用户流程
|
|
|
+- 音视频功能验证
|
|
|
+- 语音转文字功能
|
|
|
+- 多语言支持
|
|
|
+- 错误处理场景
|
|
|
+
|
|
|
+**测试位置**
|
|
|
+
|
|
|
+```
|
|
|
+e2e/
|
|
|
+├── specs/
|
|
|
+│ ├── login.spec.ts
|
|
|
+│ ├── home.spec.ts
|
|
|
+│ ├── stt-functionality.spec.ts
|
|
|
+│ └── error-handling.spec.ts
|
|
|
+├── pages/
|
|
|
+│ ├── login.page.ts
|
|
|
+│ └── home.page.ts
|
|
|
+└── fixtures/
|
|
|
+ └── test-data.ts
|
|
|
+```
|
|
|
+
|
|
|
+## 测试策略实施
|
|
|
+
|
|
|
+### 核心功能测试重点
|
|
|
+
|
|
|
+#### RTC管理器测试
|
|
|
+
|
|
|
+- 音视频轨道创建和发布
|
|
|
+- 用户加入/离开频道
|
|
|
+- 网络质量监控
|
|
|
+- 错误恢复机制
|
|
|
+
|
|
|
+#### RTM管理器测试
|
|
|
+
|
|
|
+- 实时消息发送和接收
|
|
|
+- 用户状态同步
|
|
|
+- 频道元数据管理
|
|
|
+- 连接状态处理
|
|
|
+
|
|
|
+#### STT管理器测试
|
|
|
+
|
|
|
+- 语音转文字任务启动/停止
|
|
|
+- 多语言转录和翻译
|
|
|
+- 任务状态管理
|
|
|
+- API错误处理
|
|
|
+
|
|
|
+### 测试数据管理
|
|
|
+
|
|
|
+#### 模拟数据
|
|
|
+
|
|
|
+```typescript
|
|
|
+// tests/__mocks__/agora-mocks.ts
|
|
|
+export const mockRtcClient = {
|
|
|
+ join: vi.fn(),
|
|
|
+ publish: vi.fn(),
|
|
|
+ leave: vi.fn(),
|
|
|
+}
|
|
|
+
|
|
|
+export const mockSttResponse = {
|
|
|
+ taskId: "test-task-123",
|
|
|
+ status: "started",
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+#### 测试夹具
|
|
|
+
|
|
|
+```typescript
|
|
|
+// tests/fixtures/test-data.ts
|
|
|
+export const testUserInfo = {
|
|
|
+ userId: 123456,
|
|
|
+ userName: "Test User",
|
|
|
+}
|
|
|
+
|
|
|
+export const testChannelConfig = {
|
|
|
+ channel: "test-channel",
|
|
|
+ appId: "test-app-id",
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### 测试环境配置
|
|
|
+
|
|
|
+#### 开发环境测试
|
|
|
+
|
|
|
+- 使用内存数据库和模拟服务
|
|
|
+- 快速反馈循环
|
|
|
+- 热重载测试运行
|
|
|
+
|
|
|
+#### CI/CD环境测试
|
|
|
+
|
|
|
+- 真实的Agora服务集成
|
|
|
+- 多浏览器并行测试
|
|
|
+- 性能基准测试
|
|
|
+
|
|
|
+## 测试最佳实践
|
|
|
+
|
|
|
+### 测试命名规范
|
|
|
+
|
|
|
+```typescript
|
|
|
+// 描述性测试名称
|
|
|
+describe("SttManager", () => {
|
|
|
+ it("should start transcription when valid languages provided", () => {
|
|
|
+ // 测试实现
|
|
|
+ })
|
|
|
+
|
|
|
+ it("should throw error when initialization is missing", () => {
|
|
|
+ // 测试实现
|
|
|
+ })
|
|
|
+})
|
|
|
+```
|
|
|
+
|
|
|
+### 测试结构
|
|
|
+
|
|
|
+**AAA模式 (Arrange-Act-Assert)**
|
|
|
+
|
|
|
+```typescript
|
|
|
+it("should handle user join correctly", () => {
|
|
|
+ // Arrange
|
|
|
+ const manager = new RtcManager()
|
|
|
+ const joinConfig = { channel: "test", userId: 123 }
|
|
|
+
|
|
|
+ // Act
|
|
|
+ await manager.join(joinConfig)
|
|
|
+
|
|
|
+ // Assert
|
|
|
+ expect(manager.client.join).toHaveBeenCalledWith(
|
|
|
+ expect.any(String),
|
|
|
+ "test",
|
|
|
+ expect.any(String),
|
|
|
+ 123,
|
|
|
+ )
|
|
|
+})
|
|
|
+```
|
|
|
+
|
|
|
+### 异步测试处理
|
|
|
+
|
|
|
+```typescript
|
|
|
+it("should handle async operations correctly", async () => {
|
|
|
+ // 使用async/await处理异步操作
|
|
|
+ const result = await manager.startTranscription()
|
|
|
+
|
|
|
+ expect(result).toBeDefined()
|
|
|
+ expect(result.status).toBe("started")
|
|
|
+})
|
|
|
+```
|
|
|
+
|
|
|
+## 测试覆盖率目标
|
|
|
+
|
|
|
+### 核心功能覆盖率
|
|
|
+
|
|
|
+- **管理器类**: 90%+
|
|
|
+- **工具函数**: 85%+
|
|
|
+- **自定义Hooks**: 80%+
|
|
|
+- **组件逻辑**: 70%+
|
|
|
+
|
|
|
+### 集成测试覆盖率
|
|
|
+
|
|
|
+- **用户流程**: 主要路径100%
|
|
|
+- **错误场景**: 关键错误处理100%
|
|
|
+- **边界条件**: 重要边界情况覆盖
|
|
|
+
|
|
|
+## 持续集成
|
|
|
+
|
|
|
+### GitHub Actions配置
|
|
|
+
|
|
|
+```yaml
|
|
|
+name: Test Suite
|
|
|
+on: [push, pull_request]
|
|
|
+
|
|
|
+jobs:
|
|
|
+ test:
|
|
|
+ runs-on: ubuntu-latest
|
|
|
+ steps:
|
|
|
+ - uses: actions/checkout@v3
|
|
|
+ - uses: actions/setup-node@v3
|
|
|
+ with:
|
|
|
+ node-version: 18
|
|
|
+ - run: npm ci
|
|
|
+ - run: npm run test:coverage
|
|
|
+ - run: npm run test:e2e
|
|
|
+```
|
|
|
+
|
|
|
+### 测试报告
|
|
|
+
|
|
|
+- Vitest覆盖率报告
|
|
|
+- Playwright测试报告
|
|
|
+- 测试结果可视化
|
|
|
+- 性能基准比较
|
|
|
+
|
|
|
+## 故障排除
|
|
|
+
|
|
|
+### 常见测试问题
|
|
|
+
|
|
|
+#### 异步操作超时
|
|
|
+
|
|
|
+```typescript
|
|
|
+// 增加超时时间
|
|
|
+it("should complete within timeout", async () => {
|
|
|
+ await expect(manager.longOperation()).resolves.toBeDefined()
|
|
|
+}, 10000) // 10秒超时
|
|
|
+```
|
|
|
+
|
|
|
+#### 模拟服务设置
|
|
|
+
|
|
|
+```typescript
|
|
|
+// 正确设置模拟
|
|
|
+beforeEach(() => {
|
|
|
+ vi.mock("agora-rtc-sdk-ng", () => ({
|
|
|
+ createClient: () => mockRtcClient,
|
|
|
+ }))
|
|
|
+})
|
|
|
+```
|
|
|
+
|
|
|
+### 调试技巧
|
|
|
+
|
|
|
+- 使用 `--headed` 模式运行E2E测试
|
|
|
+- 利用Playwright的追踪功能
|
|
|
+- 检查测试失败时的截图和日志
|
|
|
+- 使用Vitest的UI模式进行调试
|