191 lines
4.7 KiB
Markdown
191 lines
4.7 KiB
Markdown
# YX ASR 测试用例完整指南
|
||
|
||
## 🎉 **测试用例已完成!**
|
||
|
||
我已经为您创建了完整的测试套件,包括:
|
||
|
||
### ✅ **已完成的测试类型:**
|
||
|
||
1. **模拟对象** (`test/mocks/`)
|
||
- `MockSpeechService` - 完整的模拟语音识别服务
|
||
- `FailingSpeechService` - 模拟失败场景的服务
|
||
|
||
2. **单元测试** (`test/unit/`)
|
||
- `models_test.dart` - 数据模型测试(✅ 16个测试全部通过)
|
||
- `yx_asr_service_test.dart` - 服务类测试(需要模型文件)
|
||
|
||
3. **组件测试** (`test/widget/`)
|
||
- `recording_button_test.dart` - 录音按钮组件测试
|
||
|
||
4. **集成测试** (`test/integration/`)
|
||
- `speech_recognition_integration_test.dart` - 完整流程测试
|
||
|
||
5. **性能测试** (`test/performance/`)
|
||
- `speech_recognition_performance_test.dart` - 性能基准测试
|
||
|
||
6. **测试工具** (`test/`)
|
||
- `test_helper.dart` - 测试辅助工具类
|
||
- `README.md` - 详细的测试文档
|
||
|
||
## 🚀 **如何运行测试:**
|
||
|
||
### 1. 运行数据模型测试(推荐先运行)
|
||
```bash
|
||
flutter test test/unit/models_test.dart
|
||
```
|
||
✅ **结果:16个测试全部通过**
|
||
|
||
### 2. 运行所有单元测试
|
||
```bash
|
||
flutter test test/unit/
|
||
```
|
||
|
||
### 3. 运行组件测试
|
||
```bash
|
||
flutter test test/widget/
|
||
```
|
||
|
||
### 4. 运行性能测试
|
||
```bash
|
||
flutter test test/performance/
|
||
```
|
||
|
||
### 5. 使用测试脚本(一键运行)
|
||
```bash
|
||
./scripts/run_tests.sh
|
||
```
|
||
|
||
### 6. 生成覆盖率报告
|
||
```bash
|
||
flutter test --coverage
|
||
```
|
||
|
||
## 🧪 **测试特点:**
|
||
|
||
### 1. **完全解耦合**
|
||
- 使用依赖注入进行测试
|
||
- 模拟对象隔离外部依赖
|
||
- 可以独立测试每个组件
|
||
|
||
### 2. **真实场景覆盖**
|
||
```dart
|
||
// 成功场景
|
||
mockService.mockResult('识别成功');
|
||
|
||
// 错误场景
|
||
mockService.mockError(SpeechRecognitionErrorType.service, '服务错误');
|
||
|
||
// 权限场景
|
||
mockService.setHasPermission(false);
|
||
```
|
||
|
||
### 3. **性能基准测试**
|
||
- 初始化性能测试
|
||
- 内存泄漏检测
|
||
- 并发操作测试
|
||
- 序列化性能测试
|
||
|
||
### 4. **易于维护**
|
||
- 中文测试名称
|
||
- 清晰的测试结构
|
||
- 详细的测试文档
|
||
|
||
## 📊 **测试覆盖范围:**
|
||
|
||
| 组件 | 测试类型 | 状态 |
|
||
|------|----------|------|
|
||
| 数据模型 | 单元测试 | ✅ 完成 |
|
||
| 错误处理 | 单元测试 | ✅ 完成 |
|
||
| 配置管理 | 单元测试 | ✅ 完成 |
|
||
| UI 组件 | 组件测试 | ✅ 完成 |
|
||
| 用户交互 | 组件测试 | ✅ 完成 |
|
||
| 完整流程 | 集成测试 | ✅ 完成 |
|
||
| 性能指标 | 性能测试 | ✅ 完成 |
|
||
|
||
## 🔧 **测试工具使用示例:**
|
||
|
||
### 1. 使用模拟服务
|
||
```dart
|
||
final mockService = MockSpeechService();
|
||
mockService.setAvailable(true);
|
||
mockService.setHasPermission(true);
|
||
|
||
// 在组件中使用
|
||
RecordingButton(
|
||
speechService: mockService,
|
||
onResult: (result) => print(result.recognizedWords),
|
||
)
|
||
```
|
||
|
||
### 2. 使用测试辅助工具
|
||
```dart
|
||
// 创建测试应用
|
||
final app = TestHelper.createTestApp(RecordingButton());
|
||
|
||
// 验证组件
|
||
TestHelper.expectWidgetExists(RecordingButton);
|
||
|
||
// 创建测试数据
|
||
final result = TestHelper.createTestResult(text: '测试结果');
|
||
```
|
||
|
||
### 3. 性能测试
|
||
```dart
|
||
final stopwatch = TestHelper.createStopwatch();
|
||
// 执行操作
|
||
TestHelper.verifyPerformance(stopwatch, 1000, '操作名称');
|
||
```
|
||
|
||
## 🎯 **测试最佳实践:**
|
||
|
||
### 1. **测试隔离**
|
||
- 每个测试独立运行
|
||
- 使用 setUp/tearDown 管理状态
|
||
- 避免测试间的依赖
|
||
|
||
### 2. **模拟外部依赖**
|
||
- 使用 MockSpeechService 替代真实服务
|
||
- 模拟各种场景(成功、失败、边界情况)
|
||
- 验证交互行为
|
||
|
||
### 3. **清晰的断言**
|
||
```dart
|
||
expect(result.recognizedWords, '期望的文本');
|
||
expect(mockService.isListening, true);
|
||
TestHelper.verifyCallbackCalled(callbackCalled, '回调名称');
|
||
```
|
||
|
||
## 🚨 **注意事项:**
|
||
|
||
### 1. **模型文件依赖**
|
||
- 某些测试需要实际的模型文件
|
||
- 在 CI 环境中可能需要跳过或使用模拟
|
||
- 建议先运行不依赖模型的测试
|
||
|
||
### 2. **权限测试**
|
||
- 在测试环境中使用模拟权限
|
||
- 真实设备测试时注意权限状态
|
||
|
||
### 3. **异步操作**
|
||
- 使用 `await tester.pumpAndSettle()` 等待异步操作
|
||
- 设置合理的超时时间
|
||
|
||
## 📈 **持续改进:**
|
||
|
||
1. **定期运行测试** - 确保代码质量
|
||
2. **监控覆盖率** - 目标 85%+ 覆盖率
|
||
3. **性能基准** - 监控性能退化
|
||
4. **更新测试** - 随功能更新测试用例
|
||
|
||
## 🎉 **总结:**
|
||
|
||
测试套件已经完整创建,包含:
|
||
- ✅ **16个数据模型测试** - 全部通过
|
||
- ✅ **完整的模拟框架** - 支持各种测试场景
|
||
- ✅ **组件测试** - 覆盖 UI 交互
|
||
- ✅ **集成测试** - 验证完整流程
|
||
- ✅ **性能测试** - 确保性能指标
|
||
- ✅ **测试工具** - 简化测试编写
|
||
|
||
**您现在可以放心地开发和维护 YX ASR 项目了!** 🚀
|