如何并行运行 pytest 测试(加速测试执行)?
pytest 并行跑测试用 pytest-xdist 插件:pip install pytest-xdist 后 pytest -n auto 即可按 CPU 核数并行。本文介绍用法及注意事项。
安装 pytest-xdist 插件,然后 pytest -n auto——它通常按检测到的物理核数启动多个 worker;收益取决于负载、启动开销和共享资源,不保证测试越多提速越明显。
安装与使用
pip install pytest-xdist
# 按 CPU 核数自动并行
pytest -n auto
# 指定 worker 数
pytest -n 4
效果
应测量串行与并行用时;CPU、数据库、I/O 瓶颈或 worker 启动成本都可能限制甚至抵消收益,不能承诺固定加速比例。
注意事项
- 测试必须相互独立:并行的前提是测试之间没有依赖——不能共享可变状态、同一个数据库表、同一个临时文件等;
- 输出顺序:worker 捕获输出通常随报告汇总;-s/--capture=no 不能像串行那样直接透传各 worker 的标准输出;
- 按文件分组:
--dist loadfile让同一文件的测试在同一个 worker 上跑(适合有文件级 fixture 的场景);--dist loadscope按类/模块分组;
pytest -n auto --dist loadfile
常见问题(FAQ)
Q:并行后有测试偶发失败?
A:可能是测试间存在隐性共享状态(临时目录、端口、数据库)。给每个测试独立资源,可按需用 --dist loadscope 分组,但它不是全局资源锁;不同组/worker 仍可能争用同一数据库或端口。
Q:数据库测试能并行吗?
A:可以,但可为每个 worker 使用独立的测试数据库/schema,或实施能保证并发正确性的其他隔离策略。pytest-xdist 提供 worker_id fixture(如 gw0、gw1)用于区分资源。
Q:CI 里怎么用?
A:直接在 CI 脚本里 pytest -n auto 即可;需核对 CI 容器资源限额和检测结果,必要时明确 -n 数量,避免超额占用。