242 lines
5.4 KiB
Markdown
242 lines
5.4 KiB
Markdown
# YX ASR 测试文档
|
|
|
|
## 📋 测试结构
|
|
|
|
```
|
|
test/
|
|
├── mocks/ # 模拟对象
|
|
│ └── mock_speech_service.dart # 模拟语音识别服务
|
|
├── unit/ # 单元测试
|
|
│ └── yx_asr_service_test.dart # 核心服务测试
|
|
├── widget/ # 组件测试
|
|
│ └── recording_button_test.dart # 录音按钮测试
|
|
├── integration/ # 集成测试
|
|
│ └── speech_recognition_integration_test.dart
|
|
├── performance/ # 性能测试
|
|
│ └── speech_recognition_performance_test.dart
|
|
├── test_helper.dart # 测试辅助工具
|
|
└── README.md # 本文档
|
|
```
|
|
|
|
## 🚀 运行测试
|
|
|
|
### 运行所有测试
|
|
```bash
|
|
flutter test
|
|
```
|
|
|
|
### 运行特定类型的测试
|
|
```bash
|
|
# 单元测试
|
|
flutter test test/unit/
|
|
|
|
# 组件测试
|
|
flutter test test/widget/
|
|
|
|
# 性能测试
|
|
flutter test test/performance/
|
|
```
|
|
|
|
### 运行集成测试
|
|
```bash
|
|
flutter test integration_test/
|
|
```
|
|
|
|
### 生成测试覆盖率报告
|
|
```bash
|
|
flutter test --coverage
|
|
genhtml coverage/lcov.info -o coverage/html
|
|
```
|
|
|
|
## 🧪 测试类型说明
|
|
|
|
### 1. 单元测试 (Unit Tests)
|
|
- **目标**: 测试单个类和方法的功能
|
|
- **文件**: `test/unit/yx_asr_service_test.dart`
|
|
- **覆盖内容**:
|
|
- YxAsrService 核心功能
|
|
- 数据模型序列化/反序列化
|
|
- 配置对象创建和转换
|
|
- 错误处理逻辑
|
|
|
|
### 2. 组件测试 (Widget Tests)
|
|
- **目标**: 测试 UI 组件的行为和交互
|
|
- **文件**: `test/widget/recording_button_test.dart`
|
|
- **覆盖内容**:
|
|
- RecordingButton 渲染
|
|
- 用户交互响应
|
|
- 状态变化处理
|
|
- 自定义外观配置
|
|
- 错误状态处理
|
|
|
|
### 3. 集成测试 (Integration Tests)
|
|
- **目标**: 测试完整的用户流程
|
|
- **文件**: `test/integration/speech_recognition_integration_test.dart`
|
|
- **覆盖内容**:
|
|
- 完整的语音识别流程
|
|
- 权限处理
|
|
- 多次启动停止
|
|
- 错误恢复
|
|
|
|
### 4. 性能测试 (Performance Tests)
|
|
- **目标**: 验证性能指标和资源使用
|
|
- **文件**: `test/performance/speech_recognition_performance_test.dart`
|
|
- **覆盖内容**:
|
|
- 初始化性能
|
|
- 启动停止性能
|
|
- 内存使用
|
|
- 并发操作
|
|
- 数据序列化性能
|
|
|
|
## 🔧 测试工具
|
|
|
|
### MockSpeechService
|
|
模拟语音识别服务,用于测试:
|
|
```dart
|
|
final mockService = MockSpeechService();
|
|
|
|
// 配置模拟行为
|
|
mockService.setAvailable(true);
|
|
mockService.setHasPermission(true);
|
|
|
|
// 模拟结果
|
|
mockService.mockResult('测试结果');
|
|
|
|
// 模拟错误
|
|
mockService.mockError(SpeechRecognitionErrorType.service, '测试错误');
|
|
```
|
|
|
|
### TestHelper
|
|
测试辅助工具类,提供常用的测试方法:
|
|
```dart
|
|
// 创建测试应用
|
|
final app = TestHelper.createTestApp(RecordingButton());
|
|
|
|
// 验证组件存在
|
|
TestHelper.expectWidgetExists(RecordingButton);
|
|
|
|
// 创建测试数据
|
|
final result = TestHelper.createTestResult(text: '测试');
|
|
```
|
|
|
|
## 📊 测试覆盖率目标
|
|
|
|
| 组件 | 目标覆盖率 | 当前状态 |
|
|
|------|-----------|----------|
|
|
| YxAsrService | 90%+ | ✅ |
|
|
| RecordingButton | 85%+ | ✅ |
|
|
| 数据模型 | 95%+ | ✅ |
|
|
| 接口定义 | 100% | ✅ |
|
|
|
|
## 🎯 测试最佳实践
|
|
|
|
### 1. 测试命名
|
|
- 使用描述性的测试名称
|
|
- 中文测试名称便于理解
|
|
- 格式:`应该 + 期望行为`
|
|
|
|
### 2. 测试结构
|
|
```dart
|
|
group('功能模块测试', () {
|
|
setUp(() {
|
|
// 测试前准备
|
|
});
|
|
|
|
tearDown(() {
|
|
// 测试后清理
|
|
});
|
|
|
|
test('应该正确处理正常情况', () {
|
|
// 测试逻辑
|
|
});
|
|
|
|
test('应该正确处理异常情况', () {
|
|
// 异常测试
|
|
});
|
|
});
|
|
```
|
|
|
|
### 3. 模拟对象使用
|
|
- 使用模拟对象隔离外部依赖
|
|
- 验证交互行为
|
|
- 模拟各种场景(成功、失败、边界情况)
|
|
|
|
### 4. 异步测试
|
|
```dart
|
|
testWidgets('异步操作测试', (WidgetTester tester) async {
|
|
await tester.pumpWidget(widget);
|
|
await tester.pumpAndSettle(); // 等待动画完成
|
|
|
|
// 执行测试
|
|
await tester.tap(find.byType(Button));
|
|
await tester.pump(); // 触发重建
|
|
|
|
// 验证结果
|
|
});
|
|
```
|
|
|
|
## 🐛 常见测试问题
|
|
|
|
### 1. 权限测试
|
|
在测试环境中,权限请求可能不会真实执行,需要使用模拟:
|
|
```dart
|
|
mockService.setHasPermission(true);
|
|
```
|
|
|
|
### 2. 模型文件依赖
|
|
单元测试中避免依赖实际的模型文件:
|
|
```dart
|
|
// 只测试方法调用,不测试实际功能
|
|
expect(() => service.initialize(config), returnsNormally);
|
|
```
|
|
|
|
### 3. 异步操作超时
|
|
设置合理的超时时间:
|
|
```dart
|
|
await tester.pumpAndSettle(Duration(seconds: 5));
|
|
```
|
|
|
|
## 📈 持续集成
|
|
|
|
### GitHub Actions 配置示例
|
|
```yaml
|
|
name: Tests
|
|
on: [push, pull_request]
|
|
jobs:
|
|
test:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v2
|
|
- uses: subosito/flutter-action@v2
|
|
- run: flutter pub get
|
|
- run: flutter test --coverage
|
|
- run: flutter test integration_test/
|
|
```
|
|
|
|
## 🔍 调试测试
|
|
|
|
### 1. 打印调试信息
|
|
```dart
|
|
test('调试测试', () {
|
|
print('调试信息: $value');
|
|
debugPrint('Flutter 调试信息');
|
|
});
|
|
```
|
|
|
|
### 2. 使用断点
|
|
在 IDE 中设置断点进行调试
|
|
|
|
### 3. 测试失败分析
|
|
- 查看错误信息
|
|
- 检查测试数据
|
|
- 验证模拟对象配置
|
|
|
|
## 📝 测试报告
|
|
|
|
运行测试后会生成:
|
|
- 控制台输出结果
|
|
- 覆盖率报告 (`coverage/`)
|
|
- 性能测试结果
|
|
|
|
定期检查测试结果,确保代码质量和性能指标。
|