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
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)
架构原则验证
本次测试验证了以下架构原则:
- Repository 层: 只负责数据访问,使用
flush() - Service 层: 负责事务管理,调用
commit() - 测试层: 使用真实数据库,依赖事务回滚保证隔离
相关文档
后续工作
- 为其他 Service 层编写类似的集成测试
- 添加性能测试(测试大量数据场景)
- 添加并发测试(测试事务隔离)