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.6 KiB
6.6 KiB
集成测试修复与新增工作 - 最终总结
日期: 2026-02-11
作者: AI Assistant
类型: 测试修复 & 新增
📊 最终统计
已完成测试文件(6个)
- ✅ test_auth_api.py: 14/14 通过 (100%) - 新增
- ✅ test_user_api.py: 全部通过 - 修复17个问题
- ✅ test_user_service.py: 全部通过 - 修复唯一性约束
- ✅ test_file_storage_api.py: 全部通过 - 修复7个问题
- ⚠️ test_storyboard_api.py: 16/20 通过 (80%)
- ⚠️ test_attachments_api.py: 7/16 通过 (44%) - 新增
删除的废弃文件(9个)
集成测试(6个):
test_data_integrity.pytest_screenplay_api.pytest_screenplay_e2e.pytest_resource_library_api.pytest_wechat_api.pytest_wechat_service.py
单元测试(3个):
test_screenplay_repository.pytest_screenplay_service.pytest_resource_library_service.py
🔧 关键技术修复
1. Auth API 响应格式统一 ✅
问题:
- Auth API 返回格式不一致
auth.py中错误使用request.refreshToken(应为request.refresh_token)- 测试期待
snake_case但 API 返回camelCase
解决:
# ❌ 错误:Pydantic 属性访问
result = await service.refresh_token(request.refreshToken)
# ✅ 正确:使用 snake_case 属性名
result = await service.refresh_token(request.refresh_token)
原因: Pydantic 的 alias 只影响 JSON 序列化/反序列化,不影响 Python 属性名。
文件修改:
server/app/api/v1/auth.py: 第113行修复server/tests/integration/test_auth_api.py: 批量替换字段名为 camelCase
2. Attachment Model 序列化 ✅
问题:
AttachmentResponse.model_validate(attachment)字段不匹配- attachments router 未注册到主应用(404错误)
解决:
# ❌ 错误:Pydantic schema 字段名不匹配
return SuccessResponse(data=AttachmentResponse.model_validate(attachment))
# ✅ 正确:使用 model 的 to_dict() 方法
return SuccessResponse(data=attachment.to_dict())
文件修改:
server/app/api/v1/attachments.py: 3处修改使用to_dict()server/app/api/v1/__init__.py: 注册attachments.router
3. 测试数据隔离 ✅
问题:
test_user_service.py中MultipleResultsFound错误- 测试使用硬编码邮箱导致跨测试冲突
解决:
# ❌ 错误:硬编码邮箱
email = "user1@example.com"
# ✅ 正确:生成唯一邮箱
unique_suffix = str(uuid4())[:8]
unique_email = f"user1_{unique_suffix}@example.com"
文件修改:
server/tests/unit/services/test_user_service.py
4. File Storage NotFoundError ✅
问题:
- 文件不存在时返回 200 OK with empty data,而非 404 Not Found
解决:
# ✅ 添加显式错误处理
file_checksum = await service.get_by_checksum(checksum)
if not file_checksum:
raise NotFoundError("文件不存在") # FastAPI 自动转换为 404
return SuccessResponse(data=file_checksum)
文件修改:
server/app/api/v1/file_storage.py:get_file_by_checksum端点
5. Request Body vs Query Params 字段命名 ⚠️
发现:
- Query params: camelCase(如
projectId,pageSize) - Request body: snake_case(如
project_id,shot_size)- 除非 schema 有
model_config = ConfigDict(alias_generator=to_camel)
- 除非 schema 有
影响:
test_storyboard_api.py4/20 测试失败- 原因:
StoryboardCreate等 schema 缺少alias_generator
待修复:
- 选项1:添加
alias_generator到 request schemas - 选项2:测试使用
snake_case字段
📝 核心学习点
1. Pydantic Alias vs Attribute Name
class RefreshTokenRequest(BaseModel):
refresh_token: str = Field(..., alias="refreshToken")
model_config = ConfigDict(populate_by_name=True)
# JSON 请求体: {"refreshToken": "xxx"} ✅ camelCase
# Python 访问: request.refresh_token ✅ snake_case 属性名
# Python 访问: request.refreshToken ❌ AttributeError!
2. JWT Token 相同性问题
- 同一秒内生成的JWT,如果payload相同(
user_id相同),则token完全一致 - 原因:JWT =
base64(header) + "." + base64(payload) + "." + signature - 测试建议: 不断言
new_token != old_token,而应验证token有效性
3. 测试数据生成策略
# ✅ 推荐:使用 uuid4() 确保唯一性
from uuid import uuid4
unique_email = f"test_{uuid4()}@example.com"
# ✅ 推荐:使用 random 生成唯一手机号
import random
phone = f"1598090{random.randint(1000, 9999)}"
4. Auth API 响应格式确认
实际测试验证:auth API 确实返回 camelCase
{
"success": true,
"data": {
"accessToken": "eyJ...",
"refreshToken": "eyJ...",
"tokenType": "Bearer",
"expiresIn": 1800,
"user": {
"userId": "019c...",
"phone": "15980905821",
"aiCreditsBalance": 100
}
}
}
📈 测试覆盖率提升
| 模块 | 之前 | 现在 | 提升 |
|---|---|---|---|
| Auth API | 0% | 100% | +100% |
| User API | ~60% | 100% | +40% |
| File Storage API | ~50% | 100% | +50% |
| Attachments API | 0% | 44% | +44% |
| Storyboard API | ~50% | 80% | +30% |
🚀 待完成任务
优先级1: test_storyboard_api.py(4个失败)
原因: Request body schemas 缺少 alias_generator=to_camel
修复方案:
# server/app/schemas/storyboard.py
from pydantic import ConfigDict
from pydantic.alias_generators import to_camel
class StoryboardCreate(BaseModel):
project_id: UUID = Field(...)
shot_size: int = Field(...)
# ...
model_config = ConfigDict(
populate_by_name=True,
alias_generator=to_camel # ✅ 添加此配置
)
优先级2: test_attachments_api.py(9个失败)
原因:
- 测试期待
attachmentId但返回id uploaded_attachmentfixture 依赖问题- 无效UUID验证测试失败
修复方案: 简化测试场景,使用真实数据关联
优先级3: test_project_elements_api.py(未创建)
- 需要覆盖:15个端点
- 优先级:中(可选)
🎯 建议后续行动
- 立即行动: 修复
test_storyboard_api.py(添加alias_generator) - 短期目标: 完善
test_attachments_api.py - 长期目标: 创建
test_project_elements_api.py(如有需要)