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.6 KiB
8.6 KiB
Storyboard Resource 模块测试创建
日期: 2026-02-04
类型: 测试实现
影响范围: 分镜资源模块(图片、视频、对白、配音)
概述
为 Storyboard Resource 模块创建完整的测试套件,参考 Storyboard 模块的测试结构,覆盖 Repository、Service 和 API 三层。
变更内容
1. Repository 层测试
文件: server/tests/unit/repositories/test_storyboard_resource_repository.py
测试覆盖:
分镜图片 (StoryboardImage)
- ✅ 创建图片
- ✅ 根据 ID 获取图片
- ✅ 获取分镜的所有图片版本(按版本号降序)
- ✅ 获取激活的图片
- ✅ 获取最大版本号
- ✅ 取消所有图片的激活状态
- ✅ 更新图片
- ✅ 删除图片
分镜视频 (StoryboardVideo)
- ✅ 创建视频
- ✅ 根据 ID 获取视频
- ✅ 获取分镜的所有视频版本(按版本号降序)
- ✅ 获取激活的视频
- ✅ 获取最大版本号
- ✅ 取消所有视频的激活状态
- ✅ 更新视频
- ✅ 删除视频
对白 (StoryboardDialogue)
- ✅ 创建对白
- ✅ 根据 ID 获取对白
- ✅ 获取分镜的所有对白(按顺序号排序)
- ✅ 获取最大顺序号
- ✅ 更新对白
- ✅ 删除对白
配音 (StoryboardVoiceover)
- ✅ 创建配音
- ✅ 根据 ID 获取配音
- ✅ 获取对白的所有配音版本
- ✅ 获取激活的配音
- ✅ 取消所有配音的激活状态
- ✅ 更新配音
- ✅ 删除配音
测试数量: 40+ 测试用例
2. Service 层测试
文件: server/tests/unit/services/test_storyboard_resource_service.py
测试覆盖:
分镜图片管理
- ✅ 创建图片成功(自动版本号管理)
- ✅ 创建激活图片时取消其他图片
- ✅ 获取图片列表成功
- ✅ 设置激活图片成功
- ✅ 删除图片成功(文件引用计数管理)
- ✅ 删除激活图片失败(业务规则验证)
分镜视频管理
- ✅ 创建视频成功(自动版本号管理)
- ✅ 设置激活视频成功
对白管理
- ✅ 创建对白成功
- ✅ 创建对白自动分配顺序号
- ✅ 更新对白成功
- ✅ 重新排序对白成功
配音管理
- ✅ 创建配音成功
- ✅ 设置激活配音成功
- ✅ 删除配音成功(文件引用计数管理)
- ✅ 删除激活配音失败(业务规则验证)
测试特点:
- 使用 Mock 对象隔离依赖
- 测试权限校验逻辑
- 测试业务规则验证
- 测试文件存储集成
测试数量: 15+ 测试用例
3. API 集成测试
文件: server/tests/integration/test_storyboard_resource_api.py
测试覆盖:
分镜图片 API
- ✅ GET
/storyboards/{id}/images- 获取图片列表 - ✅ GET
/storyboards/{id}/images/active- 获取激活图片 - ✅ POST
/storyboards/{id}/images- 创建图片 - ✅ POST
/storyboard-images/{id}/activate- 设置激活图片 - ✅ DELETE
/storyboard-images/{id}- 删除图片 - ✅ 删除激活图片失败(400)
分镜视频 API
- ✅ GET
/storyboards/{id}/videos- 获取视频列表 - ✅ GET
/storyboards/{id}/videos/active- 获取激活视频 - ✅ POST
/storyboards/{id}/videos- 创建视频 - ✅ POST
/storyboard-videos/{id}/activate- 设置激活视频 - ✅ DELETE
/storyboard-videos/{id}- 删除视频
对白 API
- ✅ GET
/storyboards/{id}/dialogues- 获取对白列表 - ✅ POST
/storyboards/{id}/dialogues- 创建对白 - ✅ PATCH
/dialogues/{id}- 更新对白 - ✅ DELETE
/dialogues/{id}- 删除对白 - ✅ POST
/storyboards/{id}/dialogues/reorder- 重新排序对白
配音 API
- ✅ GET
/dialogues/{id}/voiceovers- 获取配音列表 - ✅ GET
/dialogues/{id}/voiceovers/active- 获取激活配音 - ✅ POST
/dialogues/{id}/voiceovers- 创建配音 - ✅ POST
/voiceovers/{id}/activate- 设置激活配音 - ✅ DELETE
/voiceovers/{id}- 删除配音
权限测试
- ✅ 访问其他用户的分镜资源(403)
- ✅ 未授权访问(403)
测试数量: 25+ 测试用例
测试架构
测试分层
tests/
├── unit/
│ ├── repositories/
│ │ └── test_storyboard_resource_repository.py # 数据访问层
│ └── services/
│ └── test_storyboard_resource_service.py # 业务逻辑层
└── integration/
└── test_storyboard_resource_api.py # API 端到端
测试模式
- Repository 层: 真实数据库操作,测试 SQL 查询正确性
- Service 层: Mock 依赖,测试业务逻辑和规则验证
- API 层: 完整请求-响应流程,测试 HTTP 接口
Fixture 依赖
测试需要以下 fixtures(需在 conftest.py 中定义):
# 基础 fixtures
- db_session: 数据库会话
- test_user: 测试用户
- test_project: 测试项目
- test_storyboard: 测试分镜
- auth_headers: 认证头
# 资源 fixtures
- test_storyboard_image: 单个图片
- test_storyboard_images: 多个图片(3个版本)
- test_storyboard_video: 单个视频
- test_storyboard_videos: 多个视频(3个版本)
- test_storyboard_dialogue: 单个对白
- test_storyboard_dialogues: 多个对白(3个)
- test_storyboard_voiceover: 单个配音
- test_storyboard_voiceovers: 多个配音(3个版本)
# 权限测试 fixtures
- test_other_user_storyboard: 其他用户的分镜
测试覆盖率目标
- Repository 层: 95%+
- Service 层: 90%+
- API 层: 85%+
运行测试
# 运行所有 Storyboard Resource 测试
docker exec jointo-server-app pytest tests/unit/repositories/test_storyboard_resource_repository.py -v
docker exec jointo-server-app pytest tests/unit/services/test_storyboard_resource_service.py -v
docker exec jointo-server-app pytest tests/integration/test_storyboard_resource_api.py -v
# 运行所有测试并生成覆盖率报告
docker exec jointo-server-app pytest tests/ --cov=app.repositories.storyboard_resource_repository --cov=app.services.storyboard_resource_service --cov-report=html
技术栈合规性
✅ 遵循的规范
- 测试框架: pytest + pytest-asyncio
- Mock 工具: unittest.mock.AsyncMock
- 数据库: 真实 PostgreSQL 17 + UUID v7
- 异步支持: 所有测试使用
@pytest.mark.asyncio - 命名规范:
test_<功能>_<场景> - 文档: 完整的 docstring 和注释
📋 测试最佳实践
- 隔离性: 每个测试独立,不依赖其他测试
- 可读性: 清晰的测试名称和结构(Arrange-Act-Assert)
- 覆盖性: 正常流程 + 异常流程 + 边界条件
- 性能: 使用 fixtures 复用测试数据
- 维护性: 遵循 DRY 原则,提取公共逻辑
后续工作
需要添加的 Fixtures
在 server/tests/conftest.py 中添加以下 fixtures:
@pytest.fixture
async def test_storyboard_image(db_session, test_storyboard):
"""创建测试图片"""
# 实现...
@pytest.fixture
async def test_storyboard_images(db_session, test_storyboard):
"""创建多个测试图片(3个版本)"""
# 实现...
@pytest.fixture
async def test_storyboard_video(db_session, test_storyboard):
"""创建测试视频"""
# 实现...
@pytest.fixture
async def test_storyboard_videos(db_session, test_storyboard):
"""创建多个测试视频(3个版本)"""
# 实现...
@pytest.fixture
async def test_storyboard_dialogue(db_session, test_storyboard):
"""创建测试对白"""
# 实现...
@pytest.fixture
async def test_storyboard_dialogues(db_session, test_storyboard):
"""创建多个测试对白(3个)"""
# 实现...
@pytest.fixture
async def test_storyboard_voiceover(db_session, test_storyboard, test_storyboard_dialogue):
"""创建测试配音"""
# 实现...
@pytest.fixture
async def test_storyboard_voiceovers(db_session, test_storyboard, test_storyboard_dialogue):
"""创建多个测试配音(3个版本)"""
# 实现...
测试执行验证
- 添加 fixtures 到
conftest.py - 运行测试验证通过率
- 生成覆盖率报告
- 修复失败的测试用例
参考文档
总结
已为 Storyboard Resource 模块创建完整的三层测试套件,共 80+ 测试用例,覆盖:
- 分镜图片管理(版本控制、激活状态)
- 分镜视频管理(版本控制、激活状态)
- 对白管理(顺序管理、CRUD)
- 配音管理(版本控制、激活状态)
- 权限控制和业务规则验证
测试结构清晰,遵循项目技术栈规范,为模块的稳定性和可维护性提供保障。