视觉分析模块测试总结

更新日期: 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

  1. 配置管理

    • ✅ 从文件加载配置
    • ✅ 保存配置到文件
    • ✅ 无效JSON处理
    • ✅ 配置文件不存在时创建默认配置
    • ✅ Token生成
  2. 摄像头操作

    • ✅ 添加摄像头
    • ✅ 删除摄像头
    • ✅ 列出所有摄像头
    • ✅ 获取上传URL和token
    • ✅ 启用/禁用摄像头
  3. 图片捕获

    • ✅ IP摄像头(HTTP快照、认证、错误处理)
    • ✅ USB摄像头(成功、设备未打开、导入错误)
    • ✅ HTTP上传(从缓冲区获取、从最后拍照获取、过期处理)
    • ✅ 屏幕截图(成功、导入错误)
    • ✅ 不支持的摄像头类型
  4. 图片上传

    • ✅ 接收上传(有效token、无效token、多个摄像头)

VisionAnalyzer

  1. 初始化

    • ✅ 检测OpenRouter API Key(配置、环境变量、异常处理)
    • ✅ 设置默认模型(有OpenRouter Key、无OpenRouter Key)
  2. 提示词构建

    • ✅ 基础提示词
    • ✅ 带用户问题的提示词
    • ✅ 带专家上下文的提示词
    • ✅ 组合提示词
  3. 响应解析

    • ✅ JSON格式响应
    • ✅ 带Markdown代码块的JSON
    • ✅ 纯文本响应
    • ✅ 包含analysis字段的JSON
  4. 专家相关度

    • ✅ 计算单个专家相关度
    • ✅ 计算多个专家相关度
    • ✅ 大小写不敏感匹配
    • ✅ 获取最佳专家
  5. API调用

    • ✅ OpenRouter(成功、错误、模型别名、base URL)
    • ✅ OpenAI Vision(成功、无配置、API错误)
    • ✅ Gemini Vision(成功、无配置、API错误)
    • ✅ Qwen VL(成功、无配置、API错误)
    • ✅ OpenAI兼容接口(成功、无配置fallback、API错误)
  6. 模型选择

    • ✅ 使用VisionModel枚举
    • ✅ 使用字符串模型名称
    • ✅ 使用模型别名
    • ✅ 使用默认模型
    • ✅ 各模型类型的路由
  7. 集成功能

    • ✅ 分析后计算专家相关度
    • ✅ 设置使用的模型名称

🔍 测试的边界情况和错误处理

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_path fixture 创建临时配置文件
  • 使用 PIL 创建测试图片
  • 使用 base64 编码的测试图片数据

异步测试

  • 使用 @pytest.mark.asyncio 标记异步测试
  • 使用 AsyncMock 模拟异步HTTP请求
  • 使用 patch 模拟异步客户端

✅ 测试完成情况

  • ✅ CameraService 基础功能测试
  • ✅ CameraService 扩展功能测试
  • ✅ VisionAnalyzer 基础功能测试
  • ✅ VisionAnalyzer 扩展功能测试
  • ✅ 数据类和枚举测试
  • ✅ 模块级函数测试
  • ✅ 错误处理和边界情况测试
  • ✅ 集成场景测试

🔄 后续改进建议

  1. 集成测试

    • 添加端到端测试,测试完整的图片分析流程
    • 测试摄像头服务与视觉分析器的集成
  2. 性能测试

    • 测试大量图片的处理性能
    • 测试并发请求的处理能力
  3. 真实API测试

    • 添加可选的真实API测试(使用测试API Key)
    • 测试各种视觉模型的实际响应
  4. 图像处理测试

    • 测试不同格式的图片(PNG、JPEG、WebP等)
    • 测试不同分辨率的图片处理
  5. 配置测试

    • 测试各种配置组合
    • 测试配置验证和错误处理

测试编写完成日期: 2026-02-08
预计覆盖率提升: 1-2%(整体项目)
模块覆盖率目标: 70-80%