test(wave144): tts_job 单测补全 +90 #1067

Merged
xiaoxia merged 1 commits from test/wave144-tts-job into develop 2026-07-28 12:21:57 +08:00
Owner

变更说明

TTSJob TTS任务领域模型单测补全,新增90个测试用例。

测试覆盖

  • TTSJobStatus 枚举 (5): 状态值、数量、字符串比较、从字符串构建、无效值
  • TERMINAL_STATUSES 终态 (6): 3个终态 + 2个非终态 + 数量
  • create 工厂方法 (20): 基础创建、各字段填充、采样率、格式(mp3/wav/pcm参数化)
  • 参数校验 (7): 空user_id/空input_text/超长文本(10000)/无效格式/纯空白
  • 属性 is_terminal/is_retryable/is_completed (14): 各状态下的布尔属性
  • transition_to 状态机 (15): 8条合法转换 + 4条非法转换 + 字符串输入 + updated_at更新
  • mark_ 方法* (11): mark_processing/mark_completed/mark_failed/mark_cancelled 各类场景
  • prepare_retry 重试 (7): 正常重试、清除error/started_at/completed_at、不可重试场景
  • to_dict 序列化 (6): 字段完整性、值正确性、completed/failed状态、ISO时间格式

本地验证

  • pytest: 90 passed
  • black: 已格式化
## 变更说明 TTSJob TTS任务领域模型单测补全,新增90个测试用例。 ## 测试覆盖 - **TTSJobStatus 枚举** (5): 状态值、数量、字符串比较、从字符串构建、无效值 - **TERMINAL_STATUSES 终态** (6): 3个终态 + 2个非终态 + 数量 - **create 工厂方法** (20): 基础创建、各字段填充、采样率、格式(mp3/wav/pcm参数化) - **参数校验** (7): 空user_id/空input_text/超长文本(10000)/无效格式/纯空白 - **属性 is_terminal/is_retryable/is_completed** (14): 各状态下的布尔属性 - **transition_to 状态机** (15): 8条合法转换 + 4条非法转换 + 字符串输入 + updated_at更新 - **mark_* 方法** (11): mark_processing/mark_completed/mark_failed/mark_cancelled 各类场景 - **prepare_retry 重试** (7): 正常重试、清除error/started_at/completed_at、不可重试场景 - **to_dict 序列化** (6): 字段完整性、值正确性、completed/failed状态、ISO时间格式 ## 本地验证 - pytest: 90 passed - black: 已格式化
xiaoxia added 1 commit 2026-07-28 10:42:49 +08:00
test(wave144): add tts_job unit tests (+90)
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 6s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 35s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m26s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m26s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 19s
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 / PR Build Web Image (pull_request) Successful in 34s
CI/CD Pipeline / Validate - Code Quality (pull_request) Failing after 2m14s
AI Code Review / AI Code Review (pull_request) Successful in 58s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 52s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 3m2s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m8s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
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 / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Unit Tests (pull_request) Successful in 3m10s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 2m27s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 46m10s
CI/CD Pipeline / Deploy Production (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 / Canary Release to Production (pull_request) Has been cancelled
CI/CD Pipeline / CI Gate (pull_request) Successful in 7s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Has been cancelled
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 24s
fa8ab58fc0
- TTSJobStatus 枚举: 5种状态值、字符串比较、从字符串构建
- TERMINAL_STATUSES: 3个终态验证
- create 工厂方法: 基础创建、voice_id/project_id/voice_clone_profile_id
- 采样率/格式(format参数化mp3/wav/pcm)、max_retries、metadata
- 参数校验: 空user_id/空input_text/超长文本(10000)/无效格式/纯空白
- 属性: is_terminal(5种)、is_retryable(5种)、is_completed(4种)
- transition_to: 合法转换(8条)、非法转换(4条)、字符串输入、updated_at更新
- mark_*方法: mark_processing(started_at)、mark_completed(全部字段)、mark_failed、mark_cancelled
- prepare_retry: 正常重试、清除error/started_at/completed_at、超上限不可重试
- to_dict: 字段完整性、值正确性、completed/failed状态、空时间字段、ISO时间格式
Collaborator

【阻塞级判定】

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

📊 审查概览

  • 整体评价:通过
  • 建议级问题数量:1 个

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

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

  1. [tests/unit/test_tts_job.py: 373] 避免在单元测试中使用 sleep
    • 具体内容:在 test_transition_updates_updated_at 方法中使用了 sleep(0.01) 来等待时间流逝以验证时间戳更新。虽然逻辑正确,但这会增加测试运行时间,且在某些高负载或低精度计时环境下可能导致测试不稳定(Flaky Test)。建议使用 unittest.mockpatch datetime 或相关的时间获取函数,从而完全控制时间流逝,使测试既快速又确定。

良好实践

  1. 全面的边界条件测试:测试代码详细覆盖了各种边界情况,如 test_create_input_text_exactly_10000(刚好达到限制)和 test_create_input_text_too_long(超过限制),以及空值、纯空格校验,体现了高质量的测试覆盖。
  2. 清晰的代码组织:使用了注释分隔符(如 # ── 枚举测试 ──)将不同测试类别的逻辑清晰分开,极大提升了可读性。
  3. 状态机逻辑验证TestTransitionTo 类非常系统地测试了合法与非法的状态转换,确保了领域模型的业务规则(状态机)被严格执行。
  4. 属性直接赋值用于状态构造:在 test_is_completed_no_output 等测试中,直接修改 job.status 属性来构造特定测试场景,避免了为了测试一个属性而必须调用完整的业务流程,这是单元测试中高效构造测试数据的良好实践。

🤖 由 AI 代码审查机器人自动生成 | 2026-07-28 03:31:20 | 模型:

### 【阻塞级判定】 - 是否存在阻塞级问题:否 - 阻塞级问题数量:0 个 ### 📊 审查概览 - 整体评价:通过 - 建议级问题数量:1 个 ### 🔴 阻塞级问题(必须修复) 无 ### 💡 改进建议(不阻塞合并) 1. **[tests/unit/test_tts_job.py: 373] 避免在单元测试中使用 sleep** - 具体内容:在 `test_transition_updates_updated_at` 方法中使用了 `sleep(0.01)` 来等待时间流逝以验证时间戳更新。虽然逻辑正确,但这会增加测试运行时间,且在某些高负载或低精度计时环境下可能导致测试不稳定(Flaky Test)。建议使用 `unittest.mock` 来 `patch` `datetime` 或相关的时间获取函数,从而完全控制时间流逝,使测试既快速又确定。 ### ✅ 良好实践 1. **全面的边界条件测试**:测试代码详细覆盖了各种边界情况,如 `test_create_input_text_exactly_10000`(刚好达到限制)和 `test_create_input_text_too_long`(超过限制),以及空值、纯空格校验,体现了高质量的测试覆盖。 2. **清晰的代码组织**:使用了注释分隔符(如 `# ── 枚举测试 ──`)将不同测试类别的逻辑清晰分开,极大提升了可读性。 3. **状态机逻辑验证**:`TestTransitionTo` 类非常系统地测试了合法与非法的状态转换,确保了领域模型的业务规则(状态机)被严格执行。 4. **属性直接赋值用于状态构造**:在 `test_is_completed_no_output` 等测试中,直接修改 `job.status` 属性来构造特定测试场景,避免了为了测试一个属性而必须调用完整的业务流程,这是单元测试中高效构造测试数据的良好实践。 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-07-28 03:31:20 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->

🚀 预览环境已部署

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

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

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

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

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1067 | | 预览链接 | [https://pr-1067.preview.xiaoxiajianji.com](https://pr-1067.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
xiaoxia merged commit 39990f7a07 into develop 2026-07-28 12:21:57 +08:00

🗑️ 预览环境已清理

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

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

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