test(wave218): batch_download +16测 #1190

Merged
xiaoxia merged 1 commits from test/wave218-batch-download into develop 2026-07-30 09:34:07 +08:00
Owner

wave218 batch_download 单测补全

apps/worker/worker_app/tasks/batch_download.py 补充16个单元测试:

batch_download_videos (Celery 任务)

  • 成功下载多个视频并打包上传
  • 视频不存在抛出 ValueError
  • 全部下载失败时zip含0条目,任务不崩溃
  • 部分下载失败时正常处理成功的视频
  • zip命名包含视频数量和第一个视频ID前缀
  • 单个视频下载正常
  • DB session 在正常路径被关闭
  • DB session 在异常路径也被关闭(finally保障)
  • zip内容验证:001_/002_ 序号前缀正确
  • 无 file_url 的视频被跳过
  • 0字节下载文件被跳过

_download_video_to_file 辅助函数

  • OSS下载成功时不回退到HTTP
  • OSS下载失败时回退到safe_download_file
  • OSS下载异常时回退到HTTP
  • HTTP下载失败时异常传播

其他

  • Celery task元数据验证(name, max_retries)

测试全绿:16 passed,ruff + black 通过。

## wave218 batch_download 单测补全 为 `apps/worker/worker_app/tasks/batch_download.py` 补充16个单元测试: ### batch_download_videos (Celery 任务) - ✅ 成功下载多个视频并打包上传 - ✅ 视频不存在抛出 ValueError - ✅ 全部下载失败时zip含0条目,任务不崩溃 - ✅ 部分下载失败时正常处理成功的视频 - ✅ zip命名包含视频数量和第一个视频ID前缀 - ✅ 单个视频下载正常 - ✅ DB session 在正常路径被关闭 - ✅ DB session 在异常路径也被关闭(finally保障) - ✅ zip内容验证:001_/002_ 序号前缀正确 - ✅ 无 file_url 的视频被跳过 - ✅ 0字节下载文件被跳过 ### _download_video_to_file 辅助函数 - ✅ OSS下载成功时不回退到HTTP - ✅ OSS下载失败时回退到safe_download_file - ✅ OSS下载异常时回退到HTTP - ✅ HTTP下载失败时异常传播 ### 其他 - ✅ Celery task元数据验证(name, max_retries) 测试全绿:16 passed,ruff + black 通过。
xiaoxia added 1 commit 2026-07-30 08:59:42 +08:00
test(wave218): add batch_download unit tests (+16测)
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 46s
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m30s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m37s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m41s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m46s
AI Code Review / AI Code Review (pull_request) Successful in 1m51s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 3m44s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 4m28s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 4m31s
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / Integration Tests (pull_request) Successful in 3m30s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 6m46s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 6m47s
CI/CD Pipeline / CI Gate (pull_request) Successful in 39s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 40s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 49s
2a490c5242
- batch_download_videos: success, no videos, partial failure, zip naming,
  single video, session cleanup, error session cleanup, zip contents,
  empty url skip, zero-size skip
- _download_video_to_file: OSS success/fallback, OSS exception fallback, HTTP error propagation
- Celery task metadata verification

🚀 预览环境已部署

项目 详情
PR号 #1190
预览链接 https://pr-1190.preview.xiaoxiajianji.com
API环境 staging

💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。

🔄 每次提交新代码后预览环境会自动更新。

🗑️ PR 关闭或合并后,预览环境会自动清理。

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1190 | | 预览链接 | [https://pr-1190.preview.xiaoxiajianji.com](https://pr-1190.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
Collaborator

【阻塞级判定】

  • 是否存在阻塞级问题:否
  • 阻塞级问题数量:0 个

📊 审查概览

  • 整体评价:有建议
  • 建议级问题数量:2 个

🔴 阻塞级问题(必须修复)

💡 改进建议(不阻塞合并)

  1. [tests/unit/test_batch_download.py:129] 测试名称与实现逻辑不符

    • 具体内容:测试函数名为 test_batch_download_all_downloads_fail_raises,暗示预期行为是抛出异常,但函数体内部并没有使用 pytest.raises,而是断言了成功返回的结果(r["file_count"] == 0)。根据注释判断,该测试旨在验证“下载全部失败但任务正常结束并返回空计数”的场景。建议重命名函数以准确反映其测试意图,例如改为 test_batch_download_all_downloads_succeeds_with_zero_count
  2. [tests/unit/test_batch_download.py:227] 移除未使用的导入

    • 具体内容:函数 test_batch_download_zip_contents 中导入了 import tempfile,但在函数体中并未引用该模块。虽然被测代码可能使用了 tempfile,但在本测试函数中直接引用 Pathio 处理文件,该导入是多余的,建议删除以保持代码整洁。

良好实践

  1. 测试覆盖全面:覆盖了正常流程、部分失败、全部失败、空URL、零大小文件、数据库会话关闭等多种边界条件和异常场景。
  2. Mock 设计合理:使用 _FakeVideo_FakeGeneratedVideoRepository 以及 _run_with_fakes 辅助函数,有效地隔离了外部依赖(数据库、OSS),保证了单元测试的独立性和稳定性。
  3. 资源清理验证:专门编写了测试用例(test_batch_download_session_closed)验证数据库 Session 在异常和正常情况下是否正确关闭,防止资源泄漏。
  4. 细节校验严谨:不仅校验了返回值,还进一步解压 Zip 文件校验了内部文件的命名规则(001_, 002_)和内容,确保打包逻辑符合预期。

🤖 由 AI 代码审查机器人自动生成 | 2026-07-30 01:01:35 | 模型:

### 【阻塞级判定】 - 是否存在阻塞级问题:否 - 阻塞级问题数量:0 个 ### 📊 审查概览 - 整体评价:有建议 - 建议级问题数量:2 个 ### 🔴 阻塞级问题(必须修复) 无 ### 💡 改进建议(不阻塞合并) 1. **[tests/unit/test_batch_download.py:129] 测试名称与实现逻辑不符** - 具体内容:测试函数名为 `test_batch_download_all_downloads_fail_raises`,暗示预期行为是抛出异常,但函数体内部并没有使用 `pytest.raises`,而是断言了成功返回的结果(`r["file_count"] == 0`)。根据注释判断,该测试旨在验证“下载全部失败但任务正常结束并返回空计数”的场景。建议重命名函数以准确反映其测试意图,例如改为 `test_batch_download_all_downloads_succeeds_with_zero_count`。 2. **[tests/unit/test_batch_download.py:227] 移除未使用的导入** - 具体内容:函数 `test_batch_download_zip_contents` 中导入了 `import tempfile`,但在函数体中并未引用该模块。虽然被测代码可能使用了 tempfile,但在本测试函数中直接引用 `Path` 和 `io` 处理文件,该导入是多余的,建议删除以保持代码整洁。 ### ✅ 良好实践 1. **测试覆盖全面**:覆盖了正常流程、部分失败、全部失败、空URL、零大小文件、数据库会话关闭等多种边界条件和异常场景。 2. **Mock 设计合理**:使用 `_FakeVideo` 和 `_FakeGeneratedVideoRepository` 以及 `_run_with_fakes` 辅助函数,有效地隔离了外部依赖(数据库、OSS),保证了单元测试的独立性和稳定性。 3. **资源清理验证**:专门编写了测试用例(`test_batch_download_session_closed`)验证数据库 Session 在异常和正常情况下是否正确关闭,防止资源泄漏。 4. **细节校验严谨**:不仅校验了返回值,还进一步解压 Zip 文件校验了内部文件的命名规则(`001_`, `002_`)和内容,确保打包逻辑符合预期。 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-07-30 01:01:35 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia reviewed 2026-07-30 09:33:51 +08:00
xiaoxia left a comment
Author
Owner

LGTM

LGTM
xiaoxia merged commit 540500d9f8 into develop 2026-07-30 09:34:07 +08:00

🗑️ 预览环境已清理

PR #1190 已关闭或合并,对应的预览环境已被清理。

如有需要,可以重新打开 PR 来重新生成预览环境。

🗑️ **预览环境已清理** PR #1190 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Sign in to join this conversation.