yx_speech_to_text_flutter/test/README.md

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/`)
- 性能测试结果
定期检查测试结果,确保代码质量和性能指标。