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.
 

8.9 KiB

项目服务测试执行结果

日期: 2026-01-29
类型: 测试执行报告
影响范围: 项目服务测试套件


执行概述

完成了项目服务的完整测试套件执行,包括单元测试和集成测试。

测试统计

测试类型 总数 通过 失败 通过率
Repository 单元测试 22 22 0 100%
Service 单元测试 22 22 0 100%
API 集成测试 26 16 10 61.5%
总计 70 60 10 85.7%

已通过的测试

单元测试 - Repository 层 (22/22)

基础 CRUD 操作:

  • test_create_project - 创建项目
  • test_get_by_id - 根据 ID 获取项目
  • test_get_by_id_not_found - 获取不存在的项目
  • test_update_project - 更新项目

回收站管理:

  • test_move_to_trash - 移至回收站
  • test_restore_from_trash - 从回收站恢复
  • test_permanent_delete - 永久删除

查询方法:

  • test_get_by_user - 获取用户项目列表
  • test_get_by_user_with_filters - 带筛选条件的查询
  • test_count_by_user - 统计用户项目数量
  • test_exists_by_name - 检查名称是否存在

权限管理:

  • test_check_user_permission_owner - 检查所有者权限
  • test_check_user_permission_no_access - 检查无权限情况

成员管理:

  • test_add_member - 添加成员
  • test_get_members - 获取成员列表
  • test_remove_member - 移除成员

分享管理:

  • test_create_share - 创建分享
  • test_get_shares - 获取分享列表
  • test_get_share_by_token - 通过 token 获取分享
  • test_delete_share - 删除分享

其他功能:

  • test_move_to_folder - 移动项目到文件夹
  • test_clone_project - 克隆项目

单元测试 - Service 层 (22/22)

项目管理:

  • test_get_projects_success - 获取项目列表成功
  • test_get_projects_invalid_sort_field - 无效排序字段
  • test_get_projects_invalid_sort_order - 无效排序顺序
  • test_get_project_success - 获取项目详情成功
  • test_get_project_not_found - 项目不存在
  • test_get_project_no_permission - 无权限访问
  • test_create_project_success - 创建项目成功
  • test_create_project_duplicate_name - 重复名称检查
  • test_update_project_success - 更新项目成功
  • test_delete_project_success - 删除项目成功
  • test_delete_project_not_owner - 非所有者删除

回收站管理:

  • test_restore_project_success - 恢复项目成功
  • test_restore_project_not_in_trash - 项目不在回收站
  • test_permanent_delete_success - 永久删除成功

成员管理:

  • test_add_member_success - 添加成员成功
  • test_add_member_already_exists - 成员已存在
  • test_remove_member_success - 移除成员成功
  • test_remove_member_self - 不能移除自己

分享管理:

  • test_create_share_success - 创建分享成功
  • test_revoke_share_success - 撤销分享成功

其他功能:

  • test_clone_project_success - 克隆项目成功
  • test_export_project_placeholder - 导出项目占位实现

集成测试 - API 层 (16/26)

项目列表:

  • test_get_projects_success - 获取项目列表成功
  • test_get_projects_with_filters - 带筛选条件的列表
  • test_get_projects_pagination - 分页查询

创建项目:

  • test_create_project_success - 创建项目成功
  • test_create_project_with_metadata - 创建带元数据的项目
  • test_create_project_invalid_type - 无效类型检查

项目详情:

  • test_get_project_success - 获取项目详情成功
  • test_get_project_not_found - 项目不存在

更新项目:

  • test_update_project_success - 更新项目成功
  • test_update_project_partial - 部分更新

删除项目:

  • test_delete_project_to_trash - 删除到回收站

回收站:

  • test_restore_project - 恢复项目
  • test_permanent_delete - 永久删除

其他功能:

  • test_get_members - 获取成员列表
  • test_get_shares - 获取分享列表
  • test_update_project_order - 更新项目顺序

失败的测试 (10个)

1. 认证测试问题

test_get_projects_unauthorized

错误: 期望 403,实际 200
原因: 认证 override 影响了未授权测试
修复方案: 为未授权测试单独创建不使用 override 的测试方法

# 当前问题
async def test_get_projects_unauthorized(self, async_client: AsyncClient):
    # override_auth 自动应用,导致有权限
    response = await async_client.get("/api/v1/projects")
    assert response.status_code == 403  # 实际返回 200

修复方法: 在此测试中清除 dependency override


2. Repository 方法错误

test_get_trash_projects

错误: AttributeError: 'ScalarResult' object has no attribute 'scalar_one'
位置: app/repositories/project_repository.py:159
原因: SQLModel 的 exec() 返回 ScalarResult,应使用 one() 而非 scalar_one()

# 错误代码
result = await self.session.exec(statement)
return result.scalar_one()  # ❌

# 正确代码
result = await self.session.exec(statement)
return result.one()  # ✅

3. API 响应格式问题

test_create_project_duplicate_name

错误: KeyError: 'error'
原因: 重复名称错误响应格式不符合预期
修复方案: 确保错误响应包含 error 字段

test_create_share

错误: AssertionError: assert 'shareUrl' in {...}
实际字段: share_url
原因: 响应使用 snake_case,测试期望 camelCase
修复方案: 统一使用 camelCase 或修改测试断言

# 当前响应
{
    'share_id': '...',
    'share_url': '/share/p/...',  # snake_case
    'permission': 'viewer',
    'expires_at': '...'
}

# 测试期望
assert 'shareUrl' in data  # camelCase

test_revoke_share

错误: KeyError: 'shareId'
原因: 同上,字段命名不一致


4. 枚举类型错误

test_add_member

错误: AttributeError: 'int' object has no attribute 'value'
位置: app/api/v1/projects.py:632
原因: 枚举值已经是 int,不需要调用 .value

# 错误代码
role_int = request.role.value  # request.role 已经是 int

# 正确代码
role_int = request.role  # 直接使用

test_remove_member

错误: 同上


5. 请求格式问题

test_clone_project

错误: 422 Unprocessable Entity
原因: 请求体格式不正确或缺少必需字段
修复方案: 检查 API Schema 定义和测试请求体

test_export_project

错误: 422 Unprocessable Entity
原因: 同上


6. 权限检查问题

test_move_project

错误: 期望 [200, 400, 404],实际 403
原因: 权限检查逻辑可能有问题,或测试数据不正确


修复前的准备工作

已完成的修复

  1. 日志系统迁移

    • 修复 app/main.py - 添加 __name__ 参数
    • 修复 app/services/sms_service.py - 使用 get_logger(__name__)
    • 修复 app/repositories/sms_repository.py - 使用 get_logger(__name__)
  2. 测试用户创建

    • 添加必需的 username 字段
  3. 认证 Mock

    • 使用 app.dependency_overrides 模拟认证
    • 添加 override_auth fixture
    • 移除所有 auth_headers 参数

下一步修复计划

优先级 1 - 关键错误(必须修复)

  1. Repository 方法错误

    • 修复 scalar_one()one()
    • 影响:回收站功能
  2. 枚举类型错误

    • 移除不必要的 .value 调用
    • 影响:成员管理功能

优先级 2 - API 响应格式(重要)

  1. 响应字段命名统一

    • 统一使用 camelCase 或 snake_case
    • 影响:分享功能
  2. 错误响应格式

    • 确保包含 error 字段
    • 影响:错误处理

优先级 3 - 测试改进(可选)

  1. 认证测试隔离

    • 为未授权测试单独处理
    • 影响:安全测试
  2. 请求格式修复

    • 修复克隆和导出的请求体
    • 影响:高级功能

测试环境信息

  • Python: 3.12.12
  • pytest: 7.4.4
  • FastAPI: 0.109.0
  • SQLModel: 0.0.14
  • 数据库: PostgreSQL 17 (Docker)
  • 执行时间:
    • Repository 测试: 1.46s
    • Service 测试: 0.14s
    • API 测试: 2.06s
    • 总计: ~3.7s

相关文档


报告生成时间: 2026-01-29 09:05
执行人员: Kiro AI
下一步: 系统性修复所有失败测试