视觉分析模块测试总结
更新日期: 2026-02-08
模块: shared/src/vision/
测试文件: tests/unit/test_vision.py
📊 测试统计
测试数量
- 原有测试: 21个
- 新增测试: 约 60+ 个
- 总计: 约 80+ 个测试用例
覆盖范围
CameraService 测试
- ✅ 配置加载和保存(4个测试)
- ✅ 摄像头管理(添加、删除、列表)(3个测试)
- ✅ IP摄像头拍照(成功、认证、错误处理)(4个测试)
- ✅ USB摄像头拍照(成功、失败、导入错误)(3个测试)
- ✅ 屏幕截图(成功、导入错误)(2个测试)
- ✅ HTTP上传图片(获取、接收、过期处理)(4个测试)
- ✅ 错误处理和边界情况(3个测试)
VisionAnalyzer 测试
- ✅ 初始化(OpenRouter Key检测、默认模型选择)(3个测试)
- ✅ 提示词构建(基础、问题、专家上下文、组合)(4个测试)
- ✅ 响应解析(JSON、Markdown代码块、纯文本、analysis字段)(4个测试)
- ✅ 专家相关度计算(单个、多个、大小写不敏感)(3个测试)
- ✅ OpenRouter API(成功、错误、模型别名、base URL配置)(4个测试)
- ✅ OpenAI Vision API(成功、无配置、API错误)(3个测试)
- ✅ Gemini Vision API(成功、无配置、API错误)(2个测试)
- ✅ Qwen VL API(成功、无配置、API错误)(2个测试)
- ✅ OpenAI兼容接口(成功、无配置fallback、API错误)(3个测试)
- ✅ 模型选择逻辑(字符串模型、模型别名、默认模型、各模型类型)(6个测试)
- ✅ 集成功能(专家相关度计算、模型使用标记)(2个测试)
数据类和枚举测试
- ✅ VisionModel 枚举值(1个测试)
- ✅ VisionResult 数据类(默认值、自定义值、to_dict)(3个测试)
- ✅ CameraConfig 数据类(默认值、to_dict、from_dict)(3个测试)
- ✅ CameraType 枚举(通过CameraConfig测试覆盖)
模块级函数测试
- ✅ get_vision_analyzer(单例模式)(1个测试)
- ✅ get_camera_service(单例模式)(1个测试)
🎯 测试覆盖的功能点
CameraService
配置管理
- ✅ 从文件加载配置
- ✅ 保存配置到文件
- ✅ 无效JSON处理
- ✅ 配置文件不存在时创建默认配置
- ✅ Token生成
摄像头操作
- ✅ 添加摄像头
- ✅ 删除摄像头
- ✅ 列出所有摄像头
- ✅ 获取上传URL和token
- ✅ 启用/禁用摄像头
图片捕获
- ✅ IP摄像头(HTTP快照、认证、错误处理)
- ✅ USB摄像头(成功、设备未打开、导入错误)
- ✅ HTTP上传(从缓冲区获取、从最后拍照获取、过期处理)
- ✅ 屏幕截图(成功、导入错误)
- ✅ 不支持的摄像头类型
图片上传
- ✅ 接收上传(有效token、无效token、多个摄像头)
VisionAnalyzer
初始化
- ✅ 检测OpenRouter API Key(配置、环境变量、异常处理)
- ✅ 设置默认模型(有OpenRouter Key、无OpenRouter Key)
提示词构建
- ✅ 基础提示词
- ✅ 带用户问题的提示词
- ✅ 带专家上下文的提示词
- ✅ 组合提示词
响应解析
- ✅ JSON格式响应
- ✅ 带Markdown代码块的JSON
- ✅ 纯文本响应
- ✅ 包含analysis字段的JSON
专家相关度
- ✅ 计算单个专家相关度
- ✅ 计算多个专家相关度
- ✅ 大小写不敏感匹配
- ✅ 获取最佳专家
API调用
- ✅ OpenRouter(成功、错误、模型别名、base URL)
- ✅ OpenAI Vision(成功、无配置、API错误)
- ✅ Gemini Vision(成功、无配置、API错误)
- ✅ Qwen VL(成功、无配置、API错误)
- ✅ OpenAI兼容接口(成功、无配置fallback、API错误)
模型选择
- ✅ 使用VisionModel枚举
- ✅ 使用字符串模型名称
- ✅ 使用模型别名
- ✅ 使用默认模型
- ✅ 各模型类型的路由
集成功能
- ✅ 分析后计算专家相关度
- ✅ 设置使用的模型名称
🔍 测试的边界情况和错误处理
CameraService
- ✅ 配置文件不存在
- ✅ 无效JSON配置
- ✅ 摄像头未找到
- ✅ 摄像头已禁用
- ✅ IP摄像头连接失败
- ✅ IP摄像头HTTP错误
- ✅ USB摄像头设备未打开
- ✅ OpenCV未安装
- ✅ pyautogui未安装
- ✅ 上传图片过期(超过5分钟)
- ✅ 无效的上传token
- ✅ 不支持的摄像头类型
VisionAnalyzer
- ✅ OpenRouter API Key未配置
- ✅ OpenRouter API错误
- ✅ OpenAI API未配置
- ✅ OpenAI API错误
- ✅ Gemini API未配置
- ✅ Gemini API错误
- ✅ Qwen API未配置
- ✅ Qwen API错误
- ✅ OpenAI兼容接口未配置(fallback到LLM)
- ✅ OpenAI兼容接口API错误
- ✅ JSON解析失败(回退到纯文本)
- ✅ 分析异常处理
- ✅ 配置导入异常(回退到环境变量)
📈 预期覆盖率提升
当前状态
- 当前覆盖率: 0%
- 目标覆盖率: 70-80%
预计提升
- 预计提升: 1-2%(整体项目覆盖率)
- 模块覆盖率: 预计达到 70-80%
覆盖的代码路径
camera_service.py
- ✅
_load_config()- 配置加载(成功、失败、不存在) - ✅
_save_config()- 配置保存 - ✅
_generate_token()- Token生成 - ✅
add_camera()- 添加摄像头 - ✅
remove_camera()- 删除摄像头 - ✅
list_cameras()- 列出摄像头 - ✅
capture()- 拍照主方法(所有类型) - ✅
_capture_ip_camera()- IP摄像头(成功、认证、错误) - ✅
_capture_usb_camera()- USB摄像头(成功、失败、导入错误) - ✅
_capture_usb_sync()- USB摄像头同步方法(通过异步方法测试) - ✅
_capture_screenshot()- 屏幕截图(成功、导入错误) - ✅
_get_uploaded_image()- 获取上传图片(缓冲区、最后拍照、过期) - ✅
receive_upload()- 接收上传 - ✅
get_upload_url()- 获取上传URL
vision_analyzer.py
- ✅
__init__()- 初始化(各种配置情况) - ✅
_get_openrouter_key()- 获取OpenRouter Key(配置、环境变量、异常) - ✅
_init_clients()- 初始化API客户端 - ✅
analyze()- 分析主方法(所有模型类型、字符串模型、模型别名) - ✅
_build_prompt()- 构建提示词(所有组合) - ✅
_parse_response()- 解析响应(JSON、Markdown、纯文本) - ✅
_calculate_expert_relevance()- 计算专家相关度 - ✅
get_best_expert()- 获取最佳专家 - ✅
_analyze_openrouter()- OpenRouter分析(成功、错误、模型别名) - ✅
_analyze_openai()- OpenAI分析(成功、无配置、错误) - ✅
_analyze_gemini()- Gemini分析(成功、无配置、错误) - ✅
_analyze_qwen()- Qwen分析(成功、无配置、错误) - ✅
_analyze_openai_compatible()- OpenAI兼容接口(成功、fallback、错误)
🚀 运行测试
运行所有视觉模块测试
pytest tests/unit/test_vision.py -v
运行特定测试类
# CameraService 测试
pytest tests/unit/test_vision.py::TestCameraService -v
# VisionAnalyzer 测试
pytest tests/unit/test_vision.py::TestVisionAnalyzer -v
# 扩展测试
pytest tests/unit/test_vision.py::TestCameraServiceExtended -v
pytest tests/unit/test_vision.py::TestVisionAnalyzerExtended -v
运行覆盖率测试
pytest tests/unit/test_vision.py --cov=shared/src/vision --cov-report=term-missing
运行特定标记的测试
# 只运行异步测试
pytest tests/unit/test_vision.py -v -m asyncio
📝 测试编写说明
Mock使用
- 使用
unittest.mock.patch模拟外部依赖 - 使用
AsyncMock模拟异步函数 - 使用
MagicMock模拟复杂对象
测试数据
- 使用
tmp_pathfixture 创建临时配置文件 - 使用 PIL 创建测试图片
- 使用 base64 编码的测试图片数据
异步测试
- 使用
@pytest.mark.asyncio标记异步测试 - 使用
AsyncMock模拟异步HTTP请求 - 使用
patch模拟异步客户端
✅ 测试完成情况
- ✅ CameraService 基础功能测试
- ✅ CameraService 扩展功能测试
- ✅ VisionAnalyzer 基础功能测试
- ✅ VisionAnalyzer 扩展功能测试
- ✅ 数据类和枚举测试
- ✅ 模块级函数测试
- ✅ 错误处理和边界情况测试
- ✅ 集成场景测试
🔄 后续改进建议
集成测试
- 添加端到端测试,测试完整的图片分析流程
- 测试摄像头服务与视觉分析器的集成
性能测试
- 测试大量图片的处理性能
- 测试并发请求的处理能力
真实API测试
- 添加可选的真实API测试(使用测试API Key)
- 测试各种视觉模型的实际响应
图像处理测试
- 测试不同格式的图片(PNG、JPEG、WebP等)
- 测试不同分辨率的图片处理
配置测试
- 测试各种配置组合
- 测试配置验证和错误处理
测试编写完成日期: 2026-02-08
预计覆盖率提升: 1-2%(整体项目)
模块覆盖率目标: 70-80%