pytest-xdist:把测试时间缩短到几分之一

做 Python 开发的基本都用过 pytest。项目小的时候还好,测试用例一多,跑一次等半天。几百上千个用例顺序执行,确实耗时间。

pytest-xdist 解决的就是这个问题。

核心逻辑:并行执行

pytest-xdist 是 pytest 官方团队维护的插件,核心功能是把测试分发到多个 CPU 上并行跑。原来串行跑 10 分钟的任务,8 核机器上可能 2 分钟就跑完了。

安装简单,pip 装完就能用。命令行加一个参数:

pytest -n auto

pytest 会自动检测 CPU 核心数,启动对应数量的 worker 进程,然后把测试随机分配出去。也可以手动指定进程数,比如 pytest -n 4,限制最多用 4 个进程。想跑满全部核心就用 auto,想留资源给其他任务就手动设个数。

正文顶部截图

怎么做到的

pytest 默认是顺序执行。一个测试用例跑完才跑下一个。测试之间如果有 I/O 等待或者计算密集操作,CPU 大部分时间在空闲。项目越大,浪费越明显。

pytest-xdist 的做法是启动多个 worker 进程,把测试集合拆成多份同时跑。每个 worker 是一个独立进程,有自己加载的测试用例列表。收集完所有测试后,按策略分发到各 worker。默认随机分发,也可以按目录或按文件分组。遇到某个测试特别慢,不会阻塞其他 worker 的进度。

worker 之间互不影响。一个 worker 进程崩溃,不会拖累其他的。最终汇总所有 worker 的结果,输出一份完整的测试报告。

更多功能

除了基础并行,pytest-xdist 还有几个实用功能:

分布式执行。结合 SSH,可以把测试分发到局域网内多台机器上跑。本机 CPU 不够,直接借用其他机器的算力。

–looponfail 模式。开发阶段打开这个模式,只重跑上次失败的那些测试。修改代码后,pytest 自动检测文件变化,重新执行失败的用例,通过的就不跑了。不用每次都启动全量,响应快很多。调试大项目时能省不少时间。

测试隔离。每个 worker 有独立的 Python 解释器和内存空间。测试之间不会因为共享状态互相干扰。有些隐式依赖全局变量的测试,反而容易被这种模式排查出来。

什么时候值得用

测试用例多、执行时间长的收益最明显。CI 环境里多核机器上并行跑,一次 CI 从 15 分钟降到 3 分钟,完全可以做到。

README区域截图

需要注意一点:测试间有共享资源(数据库、文件系统、外部服务)的话,需要自己处理好隔离。每个 worker 进程空间独立,不会自动同步状态。比如多个 worker 同时写同一个数据库表,可能出现竞争问题。这种情况要么把数据隔离好,要么加锁控制。如果测试本身设计良好、没有外部依赖,那几乎不需要额外处理。

pytest-xdist 目前有 1800 多个 Star,在 pytest 生态里算很稳定的插件。文档齐全,社区活跃,遇到问题基本都能找到答案。装好就能用,效果很直接,没有什么学习成本。如果你的项目测试时间超过 5 分钟,值得试试。

答案。装好就能用,效果很直接,没有什么学习成本。如果你的项目测试时间超过 5 分钟,值得试试。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐