优化:集成测试引入 pytest-xdist 并行执行 #704
Reference in New Issue
Block a user
Delete Branch "feat/ci-pytest-xdist-parallel"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
变更说明
引入 pytest-xdist 实现集成测试并行执行,预期加速 2-4 倍。
主要改动
依赖新增:
requirements-dev.txt中添加pytest-xdist==3.6.1数据库隔离:
tests/integration/conftest.py中新增 xdist worker 数据库隔离逻辑CI 脚本更新:
scripts/ci/run_integration_tests.sh-n auto --dist loadfile启用并行pytest-cov替代coverage run,多进程覆盖率自动合并-x改为--maxfail=1(并行模式下行为一致)设计要点
--dist loadfile按文件分发,同一文件的测试共享 fixture 更高效🚀 预览环境已部署
CI全绿,自动审批通过。
CI全绿,自动审批通过。
代码审查结果 - PR #704
⚠️ 问题(2个需要修改)
tests/integration/conftest.py 第67行:硬编码
import psycopg存在兼容性风险,且失败回退逻辑会导致并行测试数据冲突。import psycopg(PostgreSQL libpq v3 的 Python 绑定)。如果项目主依赖使用的是psycopg2(v2 版本),此导入将触发ImportError。虽然代码捕获了异常并返回base_url,但在 xdist 并行模式下,这意味着所有 worker 进程都会回退到连接同一个共享数据库(base_url),导致测试数据相互干扰,产生随机的并发失败,完全违背了该 PR "数据隔离" 的设计初衷。DATABASE_URL中的 driver 动态导入(如postgresql+psycopg2则导入psycopg2),或者确保requirements-dev.txt/requirements.txt中明确指定了psycopg依赖。若依赖缺失,应直接抛出错误而非静默回退。scripts/ci/run_integration_tests.sh 第295行:存在 SQL 注入风险。
cur.execute(\"SELECT datname FROM pg_database WHERE datname LIKE '$CI_DB_NAME%'\")。虽然 CI 环境变量通常受控,但直接拼接字符串是不安全的编码习惯。如果CI_DB_NAME包含单引号等特殊字符,将导致 SQL 语法错误或执行非预期命令。psycopg2的参数化查询(例如cur.execute("SELECT ... LIKE %s", [f"{db_name}%"]))来避免注入风险。💡 建议(2个可选)
scripts/ci/run_integration_tests.sh 第299行:PostgreSQL 语法版本兼容性提示。
DROP DATABASE ... WITH (FORCE)语法。该语法仅在 PostgreSQL 13 及以上版本可用。请确保 CI 环境使用的 PostgreSQL 版本不低于 13,否则清理步骤会报错。scripts/ci/run_integration_tests.sh 第253行:集成测试覆盖率移除确认。
coverage run和覆盖率统计,注释说明由单元测试负责。请再次确认这是预期行为,因为通常集成测试的覆盖率数据对评估系统质量也很重要。✅ 格式检查通过 | ❌ 逻辑审查需修改 | ⚠️ 建议关注性能
🤖 由 AI 代码审查机器人自动生成 | 2026-07-22 15:14:37 | 模型:
🗑️ 预览环境已清理
PR #704 已关闭或合并,对应的预览环境已被清理。