You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

6.7 KiB

AI Service 测试套件完成

日期: 2026-01-29
类型: 测试
影响范围: AI Service 监控功能

概述

完成了 AI Service 监控功能的完整测试套件,包括单元测试和集成测试,所有测试全部通过。

测试覆盖

单元测试(9/9 通过)

文件: server/tests/unit/services/test_ai_service_monitoring.py

测试内容:

  1. test_get_user_jobs - 获取用户任务列表
  2. test_get_user_jobs_with_filters - 带筛选条件的任务查询
  3. test_get_user_jobs_invalid_user - 无效用户 ID 处理
  4. test_get_job_statistics - 任务统计
  5. test_get_job_statistics_date_range - 时间范围统计
  6. test_get_queue_status - 队列状态监控
  7. test_handle_timeout_jobs - 超时任务处理
  8. test_handle_timeout_jobs_with_credit_refund - 超时任务积分退还
  9. test_get_user_jobs_pagination - 分页功能

Repository 层单元测试(6/6 通过)

文件: server/tests/unit/repositories/test_ai_job_repository.py

测试内容:

  1. test_get_jobs_by_filters_basic - 基础筛选
  2. test_get_jobs_by_filters_pagination - 分页
  3. test_get_jobs_by_filters_date_range - 时间范围
  4. test_get_job_statistics - 统计功能
  5. test_get_timeout_jobs - 超时任务检测
  6. test_get_jobs_by_filters_ordering - 排序功能

集成测试(6/6 通过)

文件: server/tests/integration/test_ai_task_monitoring.py

测试内容:

  1. test_timeout_job_flow - 完整的超时任务处理流程
  2. test_statistics_accuracy - 统计数据准确性
  3. test_pagination_consistency - 分页一致性
  4. test_multiple_timeout_handling - 多次超时处理
  5. test_queue_status_realtime - 队列状态实时性
  6. test_statistics_with_date_range - 时间范围统计准确性

修复的问题

1. Repository 层修复

问题: count_user_jobs 方法不支持全局统计(user_id=None

修复:

async def count_user_jobs(
    self,
    user_id: Optional[str] = None,  # 支持 None
    job_type: Optional[int] = None,
    status: Optional[int] = None
) -> int:
    """统计用户任务数量(支持全局统计)"""
    query = select(func.count(AIJob.ai_job_id))
    
    # 如果指定用户,添加用户过滤
    if user_id is not None:
        query = query.where(AIJob.user_id == user_id)
    
    # ... 其他过滤条件

文件: server/app/repositories/ai_job_repository.py

2. Service 层修复

问题: handle_timeout_jobs 方法在循环结束后才 commit,导致并发时事务冲突

修复: 每处理一个任务就提交一次,避免并发冲突

for job in timeout_jobs:
    try:
        # 处理任务...
        
        # 每处理一个任务就提交一次,避免并发冲突
        await self.db.commit()
        handled_count += 1
        
    except Exception as e:
        logger.error(f"处理超时任务失败: job_id={job.ai_job_id}, error={str(e)}")
        # 回滚当前任务的更改,继续处理下一个
        await self.db.rollback()

文件: server/app/services/ai_service.py

3. 测试 Fixture 修复

问题: test_credit_balance fixture 尝试导入不存在的 CreditBalance Model

修复: 直接使用 User 表的 ai_credits_balance 字段

@pytest_asyncio.fixture
async def test_credit_balance(db_session: AsyncSession, test_user):
    """创建测试用户的积分余额(使用 User 表的 ai_credits_balance 字段)"""
    test_user.ai_credits_balance = 1000
    await db_session.commit()
    await db_session.refresh(test_user)
    return test_user

文件: server/tests/conftest.py

4. 测试数据修复

问题:

  • CreditConsumptionLog 字段名错误(statustask_status
  • 缺少必填字段 credits_consumed
  • 多余字段 amount

修复: 使用正确的字段名和值

consumption = CreditConsumptionLog(
    consumption_id=str(uuid4()),
    user_id=test_user.user_id,
    credits_consumed=10,  # 必填字段
    feature_type=1,  # IMAGE_GENERATION
    task_status=1,  # PENDING(正确的字段名)
    task_params={'test': 'timeout_flow'}
)

文件: server/tests/integration/test_ai_task_monitoring.py

测试执行结果

单元测试

$ docker exec jointo-server-app pytest tests/unit/services/test_ai_service_monitoring.py -v
============================== 9 passed in 0.51s ===============================

$ docker exec jointo-server-app pytest tests/unit/repositories/test_ai_job_repository.py -v
============================== 6 passed in 0.20s ===============================

集成测试

$ docker exec jointo-server-app pytest tests/integration/test_ai_task_monitoring.py -v
============================== 6 passed in 9.38s ===============================

测试覆盖的功能

任务查询

  • 批量查询用户任务
  • 多维度筛选(类型、状态、时间范围)
  • 分页和排序
  • 用户验证

任务统计

  • 总体统计(总数、成功率、积分消耗)
  • 按类型分组统计
  • 按模型分组统计
  • 时间范围统计
  • 平均执行时间计算

队列监控

  • Celery Worker 状态
  • 活跃任务数
  • 预定任务数
  • 保留任务数
  • 数据库中的待处理/处理中任务数
  • 队列长度计算

超时处理

  • 超时任务检测
  • 任务状态更新
  • Celery 任务取消
  • 积分自动退还
  • 错误处理和日志记录

技术亮点

  1. 完整的测试覆盖: 从 Repository 层到 Service 层,再到集成测试
  2. Mock 策略: 使用 Mock 隔离外部依赖(Celery、Credit Service)
  3. 数据一致性验证: 验证数据库状态、积分余额、任务状态
  4. 边界条件测试: 无效用户、空结果、超时任务
  5. 并发场景: 多次超时处理的顺序执行测试

后续优化建议

  1. 测试覆盖率报告: 生成详细的代码覆盖率报告
  2. 性能测试: 添加大数据量下的性能测试
  3. 压力测试: 测试高并发场景下的系统表现
  4. 端到端测试: 添加完整的 API 端到端测试

相关文档

总结

AI Service 监控功能的测试套件已完成,所有测试全部通过(21/21):

  • 单元测试:15/15
  • 集成测试:6/6

测试覆盖了任务查询、统计、队列监控、超时处理等核心功能,确保了系统的稳定性和可靠性。