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.3 KiB

AI Service API 测试执行结果

日期: 2026-01-30
类型: 测试执行
状态: ⚠️ 发现问题

测试执行概况

执行命令:

docker exec jointo-server-app pytest tests/unit/api/test_ai_api.py -v --tb=short

测试结果:

  • 通过:3 个
  • 失败:21 个
  • ⚠️ 警告:23 个

发现的问题

问题 1:Mock 数据不完整(高优先级)

影响范围: TestModelsAPI 测试类(2 个测试失败)

错误信息:

fastapi.exceptions.ResponseValidationError: 6 validation errors:
  {'type': 'missing', 'loc': ('response', 'data', 0, 'display_name'), 'msg': 'Field required'}
  {'type': 'missing', 'loc': ('response', 'data', 0, 'description'), 'msg': 'Field required'}
  {'type': 'missing', 'loc': ('response', 'data', 0, 'unit_type'), 'msg': 'Field required'}
  {'type': 'missing', 'loc': ('response', 'data', 0, 'credits_per_unit'), 'msg': 'Field required'}
  {'type': 'missing', 'loc': ('response', 'data', 0, 'is_beta'), 'msg': 'Field required'}
  {'type': 'missing', 'loc': ('response', 'data', 0, 'config'), 'msg': 'Field required'}

根本原因: 测试中的 Mock 数据只包含部分字段,但 AIModelResponse schema 要求以下所有字段:

class AIModelResponse(BaseModel):
    model_id: str
    model_name: str
    display_name: str          # ❌ 缺失
    description: Optional[str]  # ❌ 缺失
    provider: int
    model_type: int
    cost_per_unit: float
    unit_type: int             # ❌ 缺失
    credits_per_unit: int      # ❌ 缺失
    is_beta: bool              # ❌ 缺失
    config: Dict[str, Any]     # ❌ 缺失

解决方案: 更新测试中的 Mock 数据,包含所有必需字段:

mock_service.get_available_models = AsyncMock(return_value=[
    {
        'model_id': str(uuid4()),
        'model_name': 'test-model-1',
        'display_name': '测试模型 1',        # ✅ 添加
        'description': '这是测试模型',       # ✅ 添加
        'model_type': 2,  # IMAGE
        'provider': 1,  # OPENAI
        'is_active': True,
        'cost_per_unit': 10,
        'unit_type': 1,                     # ✅ 添加
        'credits_per_unit': 10,             # ✅ 添加
        'is_beta': False,                   # ✅ 添加
        'config': {}                        # ✅ 添加
    }
])

问题 2:错误响应格式不一致(中优先级)

影响范围: TestAPIErrorHandling.test_internal_server_error(1 个测试失败)

错误信息:

assert '服务器内部错误' in response.json()['detail']
KeyError: 'detail'

根本原因: 当发生内部服务器错误时,API 返回的响应格式可能不包含 detail 字段,或者使用了不同的错误响应格式。

实际响应格式(需要确认):

{
  "code": 500,
  "message": "服务器内部错误",
  "data": null
}

解决方案: 修改测试断言,适配实际的错误响应格式:

# 方案 1:检查统一响应格式
assert response.status_code == 500
data = response.json()
assert data['code'] != 0 or '服务器内部错误' in data['message']

# 方案 2:检查 detail 字段(如果存在)
assert response.status_code == 500
data = response.json()
if 'detail' in data:
    assert '服务器内部错误' in data['detail']
else:
    assert data['code'] != 0

问题 3:所有生成任务 API 测试失败(高优先级)

影响范围:

  • TestGenerateImageAPI(4 个测试)
  • TestGenerateVideoAPI(2 个测试)
  • TestGenerateSoundAPI(1 个测试)
  • TestGenerateVoiceAPI(1 个测试)
  • TestGenerateSubtitleAPI(1 个测试)
  • TestProcessTextAPI(1 个测试)

可能原因:

  1. Mock 的 Service 方法没有正确设置
  2. API 路由或依赖注入问题
  3. 认证 token 问题

需要进一步调查: 查看具体的错误堆栈,确定是 Mock 问题还是 API 实现问题。

问题 4:任务管理 API 测试失败(高优先级)

影响范围:

  • TestJobManagementAPI(5 个测试)
  • TestStatisticsAPI(3 个测试)

可能原因: 与问题 3 类似,可能是 Mock 设置或 API 实现问题。

测试通过的用例

test_generate_image_unauthorized - 未认证访问测试
test_missing_required_fields - 缺少必需字段测试
test_invalid_field_type - 无效字段类型测试

这些测试通过说明:

  1. 认证机制工作正常
  2. Pydantic 参数验证工作正常
  3. 基础的 API 框架没有问题

警告信息

Pydantic 序列化警告(23 个):

PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected 
[field_name='total_recharged_amount', input_value=Decimal('0.00'), input_type=Decimal])

影响: 低
原因: User 模型中的 total_recharged_amount 字段是 Decimal 类型,但 Pydantic 期望 float
建议: 在 User schema 中添加 Decimal 到 float 的序列化器

下一步行动

立即修复(优先级:高)

  1. 修复 Mock 数据

    • 文件:tests/unit/api/test_ai_api.py
    • 位置:TestModelsAPI 类
    • 操作:添加缺失的字段到 Mock 数据
  2. 修复错误响应断言

    • 文件:tests/unit/api/test_ai_api.py
    • 位置:TestAPIErrorHandling.test_internal_server_error
    • 操作:适配实际的错误响应格式
  3. 调查生成任务 API 失败原因

    • 运行单个测试查看详细错误
    • 检查 Mock 设置是否正确
    • 验证 API 实现

后续优化(优先级:中)

  1. 修复 Pydantic 序列化警告

    • 文件:server/app/schemas/user.py
    • 操作:添加 Decimal 序列化器
  2. 增强测试覆盖

    • 添加更多边界条件测试
    • 添加并发测试
    • 添加性能测试

测试执行环境

  • Python: 3.12.12
  • pytest: 7.4.4
  • FastAPI: 最新版本
  • 容器: jointo-server-app
  • 数据库: PostgreSQL 17(测试数据库)

总结

测试执行发现了真实的问题,主要是:

  1. 测试本身的问题:Mock 数据不完整
  2. ⚠️ 可能的 API 问题:需要进一步调查生成任务 API 失败的原因

这些问题需要修复后才能确保 API 的稳定性。测试套件本身的设计是正确的,发现了实际的集成问题。

建议: 先修复 Mock 数据问题,然后重新运行测试,查看剩余的失败原因。