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 个测试)
可能原因:
- Mock 的 Service 方法没有正确设置
- API 路由或依赖注入问题
- 认证 token 问题
需要进一步调查: 查看具体的错误堆栈,确定是 Mock 问题还是 API 实现问题。
问题 4:任务管理 API 测试失败(高优先级)
影响范围:
- TestJobManagementAPI(5 个测试)
- TestStatisticsAPI(3 个测试)
可能原因: 与问题 3 类似,可能是 Mock 设置或 API 实现问题。
测试通过的用例
✅ test_generate_image_unauthorized - 未认证访问测试
✅ test_missing_required_fields - 缺少必需字段测试
✅ test_invalid_field_type - 无效字段类型测试
这些测试通过说明:
- 认证机制工作正常
- Pydantic 参数验证工作正常
- 基础的 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 的序列化器
下一步行动
立即修复(优先级:高)
-
修复 Mock 数据
- 文件:
tests/unit/api/test_ai_api.py - 位置:TestModelsAPI 类
- 操作:添加缺失的字段到 Mock 数据
- 文件:
-
修复错误响应断言
- 文件:
tests/unit/api/test_ai_api.py - 位置:TestAPIErrorHandling.test_internal_server_error
- 操作:适配实际的错误响应格式
- 文件:
-
调查生成任务 API 失败原因
- 运行单个测试查看详细错误
- 检查 Mock 设置是否正确
- 验证 API 实现
后续优化(优先级:中)
-
修复 Pydantic 序列化警告
- 文件:
server/app/schemas/user.py - 操作:添加 Decimal 序列化器
- 文件:
-
增强测试覆盖
- 添加更多边界条件测试
- 添加并发测试
- 添加性能测试
测试执行环境
- Python: 3.12.12
- pytest: 7.4.4
- FastAPI: 最新版本
- 容器: jointo-server-app
- 数据库: PostgreSQL 17(测试数据库)
总结
测试执行发现了真实的问题,主要是:
- ✅ 测试本身的问题:Mock 数据不完整
- ⚠️ 可能的 API 问题:需要进一步调查生成任务 API 失败的原因
这些问题需要修复后才能确保 API 的稳定性。测试套件本身的设计是正确的,发现了实际的集成问题。
建议: 先修复 Mock 数据问题,然后重新运行测试,查看剩余的失败原因。