pytest-xdist能加速测试执行,但前提是测试用例真正独立、资源完全隔离;安装只需pip install pytest-xdist,启动用pytest -n auto或-n 4等参数即可。

能加速,但不是所有测试套件都能直接开 -n 就变快——关键看测试是否真正独立、资源是否隔离。
安装和最简启动命令怎么写
装插件只要一行:pip install pytest-xdist。装完不用改配置、不碰 pytest.ini,直接加参数就能跑。
-
pytest -n auto:自动用os.cpu_count()值,通常是逻辑核心数(比如 16 线程的 CPU 就起 16 个 worker) -
pytest -n 4:明确指定 4 个进程,适合调试或限制资源占用 - 别信
-n auto一定最优——笔记本上开满核可能因内存/磁盘争抢反而更慢,建议从-n 2开始试
为什么加了 -n 反而失败或结果不稳定
常见现象是:单测全过,pytest -n 2 后偶尔 fail;或者报 PermissionError: [WinError 32] 另一个程序正在使用此文件、数据库查到脏数据、断言值飘移。
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
- 根本原因是多个 worker 进程同时操作了同一份资源:比如都写
open('log.txt', 'w')、共用一个全局计数器COUNTER、没清理的临时数据库表 -
@pytest.fixture(scope='session')在 xdist 下每个 worker 都会单独执行一次,不是“全进程共享一个实例”——这是设计,不是 bug - Windows 上 spawn 方式启动子进程,若测试里 import 了
torch或cv2,可能报AttributeError: module '__main__' has no attribute '__file__'
--dist 参数选 load、loadscope 还是 loadfile
默认是 --dist=load(按 test function 均匀分),但实际中常要换策略来避坑:
-
--dist=loadfile:把整个test_xxx.py文件分给一个 worker,适合文件内用例共享 setup/teardown 逻辑的场景 -
--dist=loadscope:按模块(class 或文件级 scope)分组,确保同模块的 fixture 不跨进程冲突,对含 DB 初始化逻辑的测试更稳 - 不要盲目用
--dist=load—— 如果某些 test function 执行时间极长(比如含 sleep 或慢 API 调用),会导致 worker 负载严重不均
CI 环境里要注意的硬件和配置细节
本地跑得通,CI 上崩,往往卡在环境差异:
- Docker 容器里默认只暴露 1 个 CPU 核心,
-n auto就只起 1 个 worker,得用--cpus=4启动容器再配-n 4 - GitHub Actions 默认 runner 是 2 核,但
os.cpu_count()返回的是逻辑核心数(可能是 4),导致超配;建议显式写-n 2 - 所有临时路径必须用
tempfile.mkdtemp()或tmp_pathfixture,绝不能硬编码/tmp/testdata
并行加速的收益边界很清晰:CPU 密集型测试(如算法校验)提升明显;I/O 密集型(HTTP 请求、DB 查询)提升有限,甚至可能因连接池争抢变慢。真正要调优的,从来不是参数,而是测试本身的隔离粒度。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










