5.4 KiB
5.4 KiB
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 # 本文档
🚀 运行测试
运行所有测试
flutter test
运行特定类型的测试
# 单元测试
flutter test test/unit/
# 组件测试
flutter test test/widget/
# 性能测试
flutter test test/performance/
运行集成测试
flutter test integration_test/
生成测试覆盖率报告
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
模拟语音识别服务,用于测试:
final mockService = MockSpeechService();
// 配置模拟行为
mockService.setAvailable(true);
mockService.setHasPermission(true);
// 模拟结果
mockService.mockResult('测试结果');
// 模拟错误
mockService.mockError(SpeechRecognitionErrorType.service, '测试错误');
TestHelper
测试辅助工具类,提供常用的测试方法:
// 创建测试应用
final app = TestHelper.createTestApp(RecordingButton());
// 验证组件存在
TestHelper.expectWidgetExists(RecordingButton);
// 创建测试数据
final result = TestHelper.createTestResult(text: '测试');
📊 测试覆盖率目标
| 组件 | 目标覆盖率 | 当前状态 |
|---|---|---|
| YxAsrService | 90%+ | ✅ |
| RecordingButton | 85%+ | ✅ |
| 数据模型 | 95%+ | ✅ |
| 接口定义 | 100% | ✅ |
🎯 测试最佳实践
1. 测试命名
- 使用描述性的测试名称
- 中文测试名称便于理解
- 格式:
应该 + 期望行为
2. 测试结构
group('功能模块测试', () {
setUp(() {
// 测试前准备
});
tearDown(() {
// 测试后清理
});
test('应该正确处理正常情况', () {
// 测试逻辑
});
test('应该正确处理异常情况', () {
// 异常测试
});
});
3. 模拟对象使用
- 使用模拟对象隔离外部依赖
- 验证交互行为
- 模拟各种场景(成功、失败、边界情况)
4. 异步测试
testWidgets('异步操作测试', (WidgetTester tester) async {
await tester.pumpWidget(widget);
await tester.pumpAndSettle(); // 等待动画完成
// 执行测试
await tester.tap(find.byType(Button));
await tester.pump(); // 触发重建
// 验证结果
});
🐛 常见测试问题
1. 权限测试
在测试环境中,权限请求可能不会真实执行,需要使用模拟:
mockService.setHasPermission(true);
2. 模型文件依赖
单元测试中避免依赖实际的模型文件:
// 只测试方法调用,不测试实际功能
expect(() => service.initialize(config), returnsNormally);
3. 异步操作超时
设置合理的超时时间:
await tester.pumpAndSettle(Duration(seconds: 5));
📈 持续集成
GitHub Actions 配置示例
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. 打印调试信息
test('调试测试', () {
print('调试信息: $value');
debugPrint('Flutter 调试信息');
});
2. 使用断点
在 IDE 中设置断点进行调试
3. 测试失败分析
- 查看错误信息
- 检查测试数据
- 验证模拟对象配置
📝 测试报告
运行测试后会生成:
- 控制台输出结果
- 覆盖率报告 (
coverage/) - 性能测试结果
定期检查测试结果,确保代码质量和性能指标。