第12篇-并行执行与 CI/CD 集成

专栏 :Playwright Python 自动化测试从入门到实战

适读人群 :测试工程师 / 测试开发 / Python 开发者

预计阅读:12 分钟


一、一个让人等不起的 CI

100 个用例串行跑完要 28 分钟 ,CI 排队 + 测试 1 小时起步。开发提交一次代码,咖啡喝完还没看到结果。

慢的测试 = 没人愿意跑的测试 = 迟早被跳过。


二、并行的三个前提(缺一不可)

前提 含义 对应篇目
用例隔离 用例之间互不干扰 第 10 篇测试数据
数据隔离 每个用例独立数据 第 10 篇工厂函数
进程隔离 多进程互不抢占资源 本篇 pytest-xdist

核心原则并行 = 隔离 + 分片 ,不是简单加 --workers


三、本地并行:pytest-xdist

安装

bash 复制代码
pip install pytest-xdist

运行

bash 复制代码
# 自动检测 CPU 核心数
pytest -n auto

# 指定进程数
pytest -n 4

工作原理:xdist 启动 N 个 worker 进程,按文件/用例分片调度。


四、分片策略(避免数据竞争)

bash 复制代码
# 按文件分片(默认,隔离性最好)
pytest -n 4 --dist=loadfile

# 按用例分片(更均匀)
pytest -n 4 --dist=loadscope

选择建议

  • 文件间无共享状态 → loadfile
  • 单文件内有共享 fixture → loadscope

五、CI 并行:GitHub Actions 矩阵

yaml 复制代码
# .github/workflows/test.yml
name: Playwright Tests

on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        shard: [1, 2, 3, 4]   # 4 路并行
    steps:
      - uses: actions/checkout@v4
      - run: pip install -r requirements.txt
      - run: playwright install
      - name: Run tests (shard ${{ matrix.shard }})
        run: pytest -n 2 --shard-id=${{ matrix.shard }} --num-shards=4
      - name: Upload report
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: report-shard-${{ matrix.shard }}
          path: allure-results/

效果 :28 分钟 → 约 8 分钟(4 路 + 每路 2 worker)。


六、失败重试(不稳定用例的缓冲)

bash 复制代码
# 失败用例自动重试 2 次
pytest --reruns 2

# 只对特定错误重试
pytest --reruns 2 --reruns-delay 1

配合 Allure(第 13 篇):重试历史会记录在报告中。


七、完整 CI 流水线(接第 13 篇报告)

复制代码
代码提交
  ↓
[Job] lint + 单测(快速反馈)
  ↓
[Job] E2E 并行(4 shard × 2 worker)
  ↓
[Job] 生成 Allure 报告 + 上传制品
  ↓
评论区附报告链接

关键配置

  • 超时:pytest --timeout=300
  • 失败时保留制品:if: always()
  • 合并报告:用 allure merge 汇总 4 路结果

八、常见坑位

❌ 坑 1:并行下共享状态冲突

python 复制代码
# 错误:全局变量被多进程同时改写
counter = 0
def test_a(): global counter; counter += 1

✅ 修复:用 fixture scope + 独立数据(第 10 篇工厂)


❌ 坑 2:端口 / 临时文件竞争

多个 worker 同时占用 8080 端口 → 随机端口或动态分配


❌ 坑 3:测试顺序依赖

python 复制代码
# 错误:假设 test_b 在 test_a 之后跑
def test_a(): create_user()
def test_b(): assert user_exists()   # 并行下可能分到不同进程

✅ 修复:每个用例自给自足(第 10 篇隔离原则)


九、性能对比(实测参考)

配置 100 用例耗时 加速比
串行 1 进程 28 min
-n 4 9 min 3.1×
4 shard × 2 worker 7.5 min 3.7×

⚠️ 加速比受限于 I/O 与服务器并发能力,并非线性。


十、与前面章节的关系

专栏篇目 关联点
第 6 篇《自动等待》 避免硬编码 sleep 导致并行抖动
第 10 篇《测试数据》 并行安全的根基:工厂 + 隔离
第 11 篇《Page Object》 PO 无状态 → 天然适合并行
第 13 篇《Allure》 CI 生成报告 + 上传制品

十一、最佳实践总结

隔离优先 :数据独立 > 进程并行

分片策略loadfile 起步,有共享 fixture 改 loadscope

失败重试--reruns 2 缓冲偶发抖动

CI 矩阵 :shard + artifact + 报告链接

监控趋势:执行时间 / 失败率纳入看板


十二、小结(建议收藏)

✅ 并行 = 用例隔离 + 数据隔离 + 进程隔离

✅ 本地 pytest -n auto,CI 用矩阵分片

✅ 失败重试 + Allure 报告 = 稳定可观测

✅ 加速比非线性,先保证隔离再谈并发


十三、下一篇预告

👉 《13-可视化报告与 Allure 深度集成》

相关推荐
11路没有终点2 天前
第 6 篇:自动等待机制
playwright·ui自动化测试
11路没有终点3 天前
第 1 篇:环境搭建与第一个测试用例
playwright
2601_962301335 天前
Playwright Stealth插件:绕过网站反爬虫检测的实战指南
自动化测试·数据采集·playwright·stealth插件·反爬虫检测
weixin_440730508 天前
Playwright介绍、特点、小例子还有与传统selenium的区别
selenium·测试工具·playwright
2601_9623878213 天前
环境不稳、用例乱跳?Playwright自动化避坑大全
自动化测试·性能优化·playwright·测试环境·flakytests
晴天1613 天前
Playwright 端到端测试实战-Day34
playwright
hao xiao zi17 天前
UI调试平台Web UI自动化项目框架设计
自动化测试·自动化·web自动化测试·playwright
阿图灵25 天前
猫眼票房监控系统实战:z3 约束求解破解字体混淆反爬
爬虫·playwright·反爬·z3·猫眼票房
wuhuhuan1 个月前
Day18_参数化实战
playwright