fix(ci): 修复测试收集错误 — 模块名冲突 + SQLite 兼容 PG 特定 SQL #1075

Closed
xiaoxia wants to merge 1 commits from fix/ci-test-collection-errors into develop
Owner

问题

CI 运行 pytest 时出现 4 个收集错误,阻塞多个 PR 合并:

  1. tests/unit/test_tts_api.pytests/integration/test_tts_api.py 模块名冲突
  2. tests/unit/test_voice_clone_api.pytests/integration/test_voice_clone_api.py 模块名冲突
    3-4. worker_app/db.py 导入时 ensure_database_exists() 执行 pg_database 查询,SQLite 环境下失败

修复

文件 改动
pytest.ini 添加 --import-mode=importlib 避免同名测试文件模块名冲突
packages/adapters/sqlalchemy_impl/session.py ensure_database_exists()initialize_database() 添加 _is_sqlite() 守卫,SQLite 跳过 PG 特定 SQL
apps/worker/worker_app/core/config.py 添加 use_in_memory_db 字段 + effective_database_url 属性
apps/worker/worker_app/db.py 使用 effective_database_url 替代 database_url

结果

  • 收集错误:4 → 0
  • 测试通过:2511 passed, 39 skipped
  • 剩余 16 个失败为预存在问题,非本次修复范围
## 问题 CI 运行 pytest 时出现 4 个收集错误,阻塞多个 PR 合并: 1. `tests/unit/test_tts_api.py` 与 `tests/integration/test_tts_api.py` 模块名冲突 2. `tests/unit/test_voice_clone_api.py` 与 `tests/integration/test_voice_clone_api.py` 模块名冲突 3-4. `worker_app/db.py` 导入时 `ensure_database_exists()` 执行 `pg_database` 查询,SQLite 环境下失败 ## 修复 | 文件 | 改动 | |------|------| | `pytest.ini` | 添加 `--import-mode=importlib` 避免同名测试文件模块名冲突 | | `packages/adapters/sqlalchemy_impl/session.py` | `ensure_database_exists()` 和 `initialize_database()` 添加 `_is_sqlite()` 守卫,SQLite 跳过 PG 特定 SQL | | `apps/worker/worker_app/core/config.py` | 添加 `use_in_memory_db` 字段 + `effective_database_url` 属性 | | `apps/worker/worker_app/db.py` | 使用 `effective_database_url` 替代 `database_url` | ## 结果 - 收集错误:4 → 0 - 测试通过:2511 passed, 39 skipped - 剩余 16 个失败为预存在问题,非本次修复范围
xiaoxia force-pushed fix/ci-test-collection-errors from e9058d9f0d to 1066b36ac2 2026-07-28 13:34:27 +08:00 Compare
xiaoxia added 1 commit 2026-07-28 13:37:43 +08:00
fix(ci): 修复测试收集错误 — 模块名冲突 + SQLite 兼容 PG 特定 SQL
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 38s
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 1m14s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m44s
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 / Validate - Type Check (mypy) (pull_request) Successful in 2m6s
CI/CD Pipeline / Validate - Code Quality (pull_request) Failing after 2m54s
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 55s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 3m47s
CI/CD Pipeline / PR Build Web Image (pull_request) Failing after 3m33s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 3m7s
AI Code Review / AI Code Review (pull_request) Failing after 3m39s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 4m5s
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) Failing after 4m50s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 4m33s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 46m15s
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 / CI Gate (pull_request) Successful in 10s
CI/CD Pipeline / Canary Release to Production (pull_request) Has been cancelled
ACR Cleanup / ACR Image Cleanup (pull_request_target) Has been cancelled
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 10s
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
2ad70c7da3
- pytest.ini: 添加 --import-mode=importlib 解决同名测试文件模块冲突
- session.py: 添加 SQLite 检测,ensure_database_exists/initialize_database 跳过PG特定逻辑
- base.py: SharedSettings 新增 use_in_memory_db 配置和 effective_database_url 属性
- worker db.py: 使用 effective_database_url 替代直接读 database_url
xiaoxia force-pushed fix/ci-test-collection-errors from 1066b36ac2 to 2ad70c7da3 2026-07-28 13:37:43 +08:00 Compare
Collaborator

【阻塞级判定】

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

📊 审查概览

  • 整体评价:需修改
  • 建议级问题数量:1 个

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

  1. [packages/config/base.py: 79] 配置属性实现与命名/注释不符
    • 问题类型:逻辑bug
    • 问题描述:配置项 use_in_memory_db 的注释明确说明为“使用 SQLite 内存内存数据库”,但在 effective_database_url 属性中,当该选项为 True 时,返回的是文件路径 sqlite:///./test.db,而非真正的内存数据库 URL(如 sqlite:///:memory:)。
    • 修改建议:如果确实需要内存数据库以实现测试隔离和加速,请将返回值修改为 "sqlite:///:memory:";如果意图是使用文件数据库,请重命名配置项(如 use_test_sqlite_file)并修正注释,以免误导使用者。当前实现会导致并发测试时出现“Database is locked”错误或数据污染问题。

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

  1. [packages/adapters/sqlalchemy_impl/session.py: 51] SQLite URL 检测方式不够健壮
    • 具体内容:_is_sqlite 函数使用字符串 startswith("sqlite") 进行判断。虽然对于标准 URL 有效,但更严谨的做法是利用 SQLAlchemy 的 make_url 解析后检查 drivername,例如:return make_url(database_url).drivername.startswith("sqlite")。这样可以更好地兼容带方言前缀的 URL(如 sqlite+pysqlite://)。

良好实践

  • initialize_database 中针对 SQLite 跳过 PostgreSQL 专有的 advisory lock,逻辑清晰且提升了测试环境的性能。
  • 修改 pytest.ini 启用 importlib 模式,有助于解决测试命名冲突问题,符合现代 pytest 最佳实践。

🤖 由 AI 代码审查机器人自动生成 | 2026-07-28 05:49:57 | 模型:

### 【阻塞级判定】 - 是否存在阻塞级问题:是 - 阻塞级问题数量:1 个 ### 📊 审查概览 - 整体评价:需修改 - 建议级问题数量:1 个 ### 🔴 阻塞级问题(必须修复) 1. **[packages/config/base.py: 79] 配置属性实现与命名/注释不符** - 问题类型:逻辑bug - 问题描述:配置项 `use_in_memory_db` 的注释明确说明为“使用 SQLite 内存内存数据库”,但在 `effective_database_url` 属性中,当该选项为 True 时,返回的是文件路径 `sqlite:///./test.db`,而非真正的内存数据库 URL(如 `sqlite:///:memory:`)。 - 修改建议:如果确实需要内存数据库以实现测试隔离和加速,请将返回值修改为 `"sqlite:///:memory:"`;如果意图是使用文件数据库,请重命名配置项(如 `use_test_sqlite_file`)并修正注释,以免误导使用者。当前实现会导致并发测试时出现“Database is locked”错误或数据污染问题。 ### 💡 改进建议(不阻塞合并) 1. **[packages/adapters/sqlalchemy_impl/session.py: 51] SQLite URL 检测方式不够健壮** - 具体内容:`_is_sqlite` 函数使用字符串 `startswith("sqlite")` 进行判断。虽然对于标准 URL 有效,但更严谨的做法是利用 SQLAlchemy 的 `make_url` 解析后检查 `drivername`,例如:`return make_url(database_url).drivername.startswith("sqlite")`。这样可以更好地兼容带方言前缀的 URL(如 `sqlite+pysqlite://`)。 ### ✅ 良好实践 - 在 `initialize_database` 中针对 SQLite 跳过 PostgreSQL 专有的 advisory lock,逻辑清晰且提升了测试环境的性能。 - 修改 `pytest.ini` 启用 `importlib` 模式,有助于解决测试命名冲突问题,符合现代 pytest 最佳实践。 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-07-28 05:49:57 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia closed this pull request 2026-07-28 14:34:13 +08:00

🗑️ 预览环境已清理

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

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

🗑️ **预览环境已清理** PR #1075 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Some checks are pending
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 38s
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 1m14s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m44s
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 / Validate - Type Check (mypy) (pull_request) Successful in 2m6s
CI/CD Pipeline / Validate - Code Quality (pull_request) Failing after 2m54s
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 55s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 3m47s
CI/CD Pipeline / PR Build Web Image (pull_request) Failing after 3m33s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 3m7s
AI Code Review / AI Code Review (pull_request) Failing after 3m39s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 4m5s
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) Failing after 4m50s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 4m33s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 46m15s
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 / CI Gate (pull_request) Successful in 10s
CI/CD Pipeline / Canary Release to Production (pull_request) Has been cancelled
ACR Cleanup / ACR Image Cleanup (pull_request_target) Has been cancelled
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 10s
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped

Pull request closed

Sign in to join this conversation.