# TTS/ASR 测试指南 本文档提供完整的测试脚本使用说明,包括单元测试、集成测试和macOS环境模拟测试。 ## 测试脚本概览 | 脚本 | 位置 | 用途 | 需要后端服务 | |------|------|------|--------------| | `test_tts_asr_unit.py` | `backend/tests/` | 单元测试(设备检测、模型选择、音频处理) | 否 | | `test_tts_asr_integration.py` | `backend/tests/` | 集成测试(API端点、完整流程) | 是 | | `simulate_macos.py` | `backend/tests/` | macOS环境模拟(在非Mac环境测试) | 否 | ## 快速开始 ### 1. 单元测试(推荐首先运行) 单元测试不需要实际运行模型或后端服务,测试代码逻辑: ```bash # 使用pytest运行(推荐) pytest backend/tests/test_tts_asr_unit.py -v # 直接运行 python backend/tests/test_tts_asr_unit.py # 运行特定测试类 pytest backend/tests/test_tts_asr_unit.py::TestAppleSiliconDetection -v # 运行特定测试方法 pytest backend/tests/test_tts_asr_unit.py::TestAppleSiliconDetection::test_is_apple_silicon_on_darwin_arm64 -v ``` ### 2. macOS环境模拟测试 在非macOS环境下模拟Apple Silicon环境: ```bash # 运行完整模拟测试套件 python backend/tests/simulate_macos.py --full-simulation # 仅模拟Apple Silicon环境并进入交互模式 python backend/tests/simulate_macos.py --apple-silicon # 模拟特定设备 python backend/tests/simulate_macos.py --device mps python backend/tests/simulate_macos.py --device cuda # 运行特定测试 python backend/tests/simulate_macos.py --test device # 设备检测 python backend/tests/simulate_macos.py --test memory # 内存管理 python backend/tests/simulate_macos.py --test model # 模型选择 python backend/tests/simulate_macos.py --test audio # 音频处理 python backend/tests/simulate_macos.py --test env # 环境变量 ``` ### 3. 集成测试 集成测试需要运行后端服务: ```bash # 1. 启动后端服务(终端1) python backend/main.py # 2. 运行集成测试(终端2) # 运行所有测试 python backend/tests/test_tts_asr_integration.py # 运行特定测试 python backend/tests/test_tts_asr_integration.py --test config # 配置端点 python backend/tests/test_tts_asr_integration.py --test status # 状态端点 python backend/tests/test_tts_asr_integration.py --test warmup # 预热测试 python backend/tests/test_tts_asr_integration.py --test tts # TTS测试 python backend/tests/test_tts_asr_integration.py --test asr # ASR测试 python backend/tests/test_tts_asr_integration.py --test perf # 性能测试 # 自定义API地址 python backend/tests/test_tts_asr_integration.py --url http://localhost:8001 --key your-api-key ``` ## 详细测试说明 ### 单元测试详解 #### TestAppleSiliconDetection 测试Apple Silicon检测功能: - `test_is_apple_silicon_on_darwin_arm64`: 在Darwin/arm64环境检测 - `test_is_apple_silicon_on_windows`: 在Windows环境不应检测到 - `test_is_apple_silicon_on_linux`: 在Linux环境不应检测到 #### TestEnvironmentVariables 测试环境变量解析: - `test_default_environment_values`: 验证默认值 - `test_custom_environment_values`: 验证自定义值 #### TestModelSizeSelection 测试模型大小选择: - `test_whisper_model_sizes_mapping`: 模型大小映射验证 - `test_recommended_model_size_explicit`: 显式指定大小 - `test_invalid_model_size_falls_back`: 无效大小回退 #### TestAudioValidation 测试音频验证: - `test_validate_empty_audio`: 空音频验证 - `test_validate_valid_wav_header`: 有效WAV头验证 - `test_validate_invalid_audio`: 无效音频验证 #### TestAudioResampling 测试音频重采样: - `test_resample_same_rate`: 相同采样率 - `test_resample_different_rate`: 不同采样率重采样 - `test_resample_downsample`: 下采样 #### TestDeviceCapabilities 测试设备能力检测: - `test_device_capabilities_dataclass`: 数据类验证 - `test_device_capabilities_with_mps`: MPS设备能力 #### TestModelCacheCheck 测试模型缓存检查: - `test_cache_check_non_offline_mode`: 非离线模式 - `test_cache_check_offline_mode_missing`: 离线模式缺失模型 #### TestRequestResponseModels 测试API模型: - `test_tts_request_model`: TTS请求模型 - `test_asr_request_model`: ASR请求模型 - `test_model_status_model`: 状态模型 ### 集成测试详解 #### TTSASRIntegrationTest 主要集成测试: - `test_01_config_endpoint`: 配置端点测试 - `test_02_status_endpoint`: 状态端点测试 - `test_03_warmup_endpoint`: 预热端点测试 - `test_04_tts_endpoint_basic`: TTS基本功能测试 - `test_05_asr_endpoint_basic`: ASR基本功能测试 - `test_06_api_key_validation`: API密钥验证测试 - `test_07_tts_long_text`: TTS长文本测试 #### PerformanceTest 性能测试: - `test_tts_latency`: TTS延迟测试 ### macOS模拟测试详解 #### MacOSSimulator类 提供以下模拟功能: - `simulate_apple_silicon()`: 模拟Darwin/arm64环境 - `simulate_mps_device()`: 模拟MPS设备可用 - `simulate_cuda_device()`: 模拟CUDA设备可用 - `cleanup()`: 清理模拟环境 #### 独立测试函数 - `test_device_detection_on_apple_silicon()`: Apple Silicon设备检测 - `test_memory_management()`: 内存管理测试 - `test_model_size_selection()`: 模型大小选择测试 - `test_audio_processing()`: 音频处理测试 - `test_environment_variables()`: 环境变量测试 ## 测试覆盖率 ### 单元测试覆盖的功能 - [x] Apple Silicon检测逻辑 - [x] 环境变量解析和默认值 - [x] 模型大小选择和推荐 - [x] 音频数据验证 - [x] 音频重采样(多回退方案) - [x] 设备能力检测数据结构 - [x] 模型缓存检查 - [x] API请求/响应模型 ### 集成测试覆盖的功能 - [x] 配置端点(`/v1/tts-asr/config`) - [x] 状态端点(`/v1/tts-asr/status`) - [x] 预热端点(`/v1/tts-asr/warmup`) - [x] TTS端点(`/v1/tts-asr/tts`) - [x] ASR端点(`/v1/tts-asr/asr`) - [x] API密钥验证 - [x] 长文本处理 - [x] 性能基准测试 ### macOS模拟测试覆盖的场景 - [x] Apple Silicon环境模拟 - [x] MPS设备模拟 - [x] CUDA设备模拟 - [x] 系统内存模拟 - [x] 完整环境变量测试 ## 常见测试场景 ### 场景1: 开发时快速验证 ```bash # 快速单元测试 pytest backend/tests/test_tts_asr_unit.py -v --tb=short # macOS模拟(完整) python backend/tests/simulate_macos.py --full-simulation ``` ### 场景2: 验证特定配置 ```bash # 设置环境变量后测试 export TTS_ASR_MODEL_SIZE=small export TTS_ASR_QUANTIZE=true # 运行测试 python backend/tests/simulate_macos.py --test model ``` ### 场景3: API功能验证 ```bash # 启动服务 python backend/main.py # 测试配置端点 python backend/tests/test_tts_asr_integration.py --test config # 测试TTS功能 python backend/tests/test_tts_asr_integration.py --test tts # 测试ASR功能 python backend/tests/test_tts_asr_integration.py --test asr ``` ### 场景4: 性能基准测试 ```bash # 启动服务 python backend/main.py # 运行性能测试 python backend/tests/test_tts_asr_integration.py --test perf ``` ## 测试输出解读 ### 成功示例 ``` test_is_apple_silicon_on_darwin_arm64 ... ok test_is_apple_silicon_on_windows ... ok test_is_apple_silicon_on_linux ... ok ---------------------------------------------------------------------- Ran 3 tests in 0.005s OK ``` ### 失败示例 ``` test_device_detection_on_apple_silicon ... FAIL ====================================================================== FAIL: test_device_detection_on_apple_silicon ---------------------------------------------------------------------- Traceback (most recent call last): File "test_tts_asr_unit.py", line 45, in test_is_apple_silicon_on_darwin_arm64 self.assertTrue(_is_apple_silicon()) AssertionError: False is not true ---------------------------------------------------------------------- Ran 1 tests in 0.002s FAILED (failures=1) ``` ## 持续集成配置 ### GitHub Actions示例 ```yaml name: TTS/ASR Tests on: [push, pull_request] jobs: unit-tests: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: actions/setup-python@v4 with: python-version: '3.10' - name: Install dependencies run: | pip install -r backend/requirements.txt pip install pytest - name: Run unit tests run: pytest backend/tests/test_tts_asr_unit.py -v - name: Run macOS simulation run: python backend/tests/simulate_macos.py --full-simulation ``` ### pytest配置 创建 `pytest.ini`: ```ini [pytest] testpaths = backend/tests python_files = test_*.py python_classes = Test* python_functions = test_* addopts = -v --tb=short ``` ## 故障排查 ### 问题1: 导入错误 ``` ModuleNotFoundError: No module named 'backend' ``` **解决方案**: ```bash # 确保在项目根目录运行 cd /path/to/llm-in-text # 或设置PYTHONPATH export PYTHONPATH="${PYTHONPATH}:$(pwd)" ``` ### 问题2: 后端服务连接失败 ``` ✗ 无法连接到服务: [Errno 111] Connection refused ``` **解决方案**: ```bash # 确保后端服务正在运行 python backend/main.py # 检查端口 lsof -i :8001 # 或使用自定义URL python backend/tests/test_tts_asr_integration.py --url http://localhost:8001 ``` ### 问题3: 模型未加载 ``` ⚠ TTS失败(可能是模型未加载) ``` **解决方案**: 这是预期行为,表示模型需要时间下载。可以: 1. 等待模型下载完成 2. 使用预热端点: `POST /v1/tts-asr/warmup` 3. 启用离线模式(如果模型已下载) ### 问题4: 测试超时 ``` httpx.ReadTimeout: timed out ``` **解决方案**: ```bash # 增加超时时间 export TEST_TIMEOUT=300.0 # 或在测试脚本中修改 TEST_TIMEOUT = 300.0 # 5分钟 ``` ## 最佳实践 1. **开发时**: 频繁运行单元测试 ```bash pytest backend/tests/test_tts_asr_unit.py -v --tb=short ``` 2. **提交前**: 运行完整测试套件 ```bash pytest backend/tests/test_tts_asr_unit.py -v python backend/tests/simulate_macos.py --full-simulation ``` 3. **部署前**: 运行集成测试 ```bash python backend/tests/test_tts_asr_integration.py ``` 4. **调试时**: 使用详细输出 ```bash pytest backend/tests/test_tts_asr_unit.py -v -s --tb=long ``` ## 测试报告 生成测试覆盖率报告: ```bash # 安装coverage pip install pytest-cov # 运行并生成报告 pytest backend/tests/test_tts_asr_unit.py --cov=backend.tts_asr --cov-report=html # 查看报告 open htmlcov/index.html ``` ## 相关文档 - [TTS/ASR修复说明](./TTS_ASR_MACOS_FIX.md) - [环境变量配置](../README.md#ttsasr环境变量配置) - [API文档](../README.md#api接口) --- **更新日期**: 2026-04-06 **维护者**: 项目开发团队