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.
 

3.4 KiB

Project Service 集成测试实现

日期: 2026-02-04
类型: 测试
影响范围: server/tests/unit/services/test_project_service.py, server/tests/conftest.py

概述

test_project_service.py 从 Mock 测试重写为集成测试,使用真实数据库测试 Service 层的事务管理和业务逻辑。

变更内容

1. 测试文件重写

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

  • 测试方法数量: 29 个
  • 测试策略: 从 Mock 测试改为集成测试
  • 数据创建: 在测试方法内直接创建数据,不使用 fixture
  • 事务管理: 依赖 conftest 的自动回滚机制

测试覆盖:

  • 项目创建(5 个测试)
  • 项目查询(6 个测试)
  • 项目更新(4 个测试)
  • 项目删除(2 个测试)
  • 回收站管理(4 个测试)
  • 成员管理(4 个测试)
  • 分享管理(2 个测试)
  • 其他功能(2 个测试:移动、克隆)

2. conftest.py 优化

文件: server/tests/conftest.py

修改前:

async with async_session() as session:
    try:
        yield session
    finally:
        await session.rollback()
        await session.close()

修改后:

connection = await async_engine.connect()
transaction = await connection.begin()

async_session = sessionmaker(
    bind=connection,
    class_=AsyncSession,
    expire_on_commit=False,
    autocommit=False,
    autoflush=False
)

async with async_session() as session:
    yield session
    
    # 回滚事务
    await transaction.rollback()
    await connection.close()

改进点:

  • 使用连接级别的事务管理
  • 确保 Service 层的 commit() 调用被正确回滚
  • 保证测试之间的完全隔离

3. 关键修复

问题 1: FolderCategory 枚举错误

  • 错误: 使用了不存在的 FolderCategory.PROJECT
  • 修复: 改为 FolderCategory.MY_PROJECTS

问题 2: 参数顺序错误

  • 错误: service.create_project(data, str(user_id))
  • 修复: service.create_project(str(user_id), data)

问题 3: ProjectCreate Schema 类型错误

  • 错误: 使用字符串 type="mine"
  • 修复: 使用枚举 type=ProjectTypeEnum.MINE

问题 4: 测试中调用 commit()

  • 错误: 测试中调用 await db_session.commit() 导致数据持久化
  • 修复: 移除所有 commit() 调用,依赖 conftest 的自动回滚

问题 5: 断言比较问题

  • 错误: UUID 对象比较失败
  • 修复: 使用字符串比较 str(project.id) == str(created.id)

测试结果

============================= 29 passed in 0.41s ==============================

通过率: 100% (29/29)

架构原则验证

本次测试验证了以下架构原则:

  1. Repository 层: 只负责数据访问,使用 flush()
  2. Service 层: 负责事务管理,调用 commit()
  3. 测试层: 使用真实数据库,依赖事务回滚保证隔离

相关文档

后续工作

  • 为其他 Service 层编写类似的集成测试
  • 添加性能测试(测试大量数据场景)
  • 添加并发测试(测试事务隔离)