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