跳转到主要内容

pytest xdist插件,用于分布式测试和循环失败的模式

项目描述

PyPI version https://img.shields.io/conda/vn/conda-forge/pytest-xdist.svg Python versions Travis CI build status AppVeyor build status https://img.shields.io/badge/code%20style-black-000000.svg

xdist: pytest分布式测试插件

pytest-xdist插件扩展了pytest,增加了独特的测试执行模式

  • 测试运行 并行化:如果您有多核CPU或主机,可以使用它们进行组合测试运行。这可以加快开发速度或使用远程机器的特殊资源。

  • --looponfail:在一个子进程中重复运行您的测试。在每次运行后,pytest等待项目中的某个文件发生变化,然后重新运行之前失败的测试。这会一直重复,直到所有测试通过,然后再次进行完整的运行。

  • 多平台 覆盖范围:您可以指定不同的Python解释器或不同的平台,并在所有这些平台上并行运行测试。

在远程运行测试之前,pytest会有效地“rsync”您的程序源代码到远程位置。所有测试结果都会被报告并显示在您的本地终端上。您可以指定不同的Python版本和解释器。

如果您想了解pytest-xdist在底层是如何工作的,请查看概览

安装

使用以下命令安装插件:

pip install pytest-xdist

或者使用开发/就地模式的pytest-xdist仓库中的包

pip install --editable .

通过将测试发送到多个CPU来加速测试运行

要将测试发送到多个CPU,请输入

pytest -n NUM

特别是对于运行时间较长的测试或需要大量I/O的测试,这可以显著提高速度。此选项也可以设置为auto以自动检测CPU数量。

如果测试导致解释器崩溃,pytest-xdist将自动重新启动该工作进程并以通常的方式报告失败。您可以使用--max-worker-restart选项来限制可以重新启动的工作进程数量,或者使用--max-worker-restart=0完全禁用重新启动。

默认情况下,-n选项将待处理测试发送到任何可用的工作进程,而不保证顺序,但您可以使用以下选项来控制此行为

  • --dist=loadscope:测试将按模块测试函数进行分组,按测试方法进行分组,然后每个组将发送到可用的工作进程,保证组内所有测试在同一个进程中运行。如果您有昂贵的模块级或类级固定值,这可能会很有用。目前,分组不能自定义,按类分组比按模块分组优先。此功能是在版本1.19中添加的。

  • --dist=loadfile:测试将按文件名分组,然后发送到可用的工作进程,保证组内所有测试在同一个工作进程中运行。此功能是在版本1.21中添加的。

在Python子进程中运行测试

要实例化一个python3.5子进程并将测试发送到它,您可以输入

pytest -d --tx popen//python=python3.5

这将启动一个子进程,该子进程使用系统二进制查找路径中找到的python3.5 Python解释器运行。

如果您将–tx选项值前缀为这样

--tx 3*popen//python=python3.5

则将创建三个子进程,并将测试在这些三个进程之间负载均衡。

在封装的子进程中运行测试

此功能已移至pytest-forked插件,但为了向后兼容,--boxed选项仍然保留。

将测试发送到远程SSH账户

假设您有一个包含一些您可以成功本地运行的测试的包mypkg。您还有一个可ssh访问的机器myhost。然后,您可以通过输入以下内容来临时分配您的测试

pytest -d --tx ssh=myhostpopen --rsyncdir mypkg mypkg

这将同步您的mypkg包目录到远程ssh账户,然后本地收集测试并将它们发送到远程位置进行执行。

您可以指定多个要发送到远程端的--rsyncdir目录。

您可以为发送到远程端时忽略的文件指定多个 --rsyncignore 通配符模式。还有内部忽略规则:.*, *.pyc, *.pyo, *~ 这些规则您不能使用 rsyncignore 命令行或 ini 文件选项覆盖。

向远程 Socket 服务器发送测试

下载单个模块的 socketserver.py Python 程序,并按如下方式运行

python socketserver.py

它将告诉您它正在默认端口上监听。现在您可以在您的家用计算机上指定这个新的 Socket 主机,例如

pytest -d --tx socket=192.168.1.102:8888 --rsyncdir mypkg mypkg

同时运行多个平台上的测试

在多个平台上运行测试的基本命令是

pytest --dist=each --tx=spec1 --tx=spec2

如果您指定了 Windows 主机、OSX 主机和 Linux 环境,此命令将发送每个测试到所有平台,并一次性报告所有平台的失败情况。规格字符串使用 xspec 语法

在测试中识别工作进程

新增于版本 1.15。

如果您需要在测试或 fixture 中确定工作进程的身份,可以使用 worker_id fixture 来实现

@pytest.fixture()
def user_account(worker_id):
    """ use a different account in each xdist worker """
    return "account_%s" % worker_id

xdist 被禁用(例如使用 -n0 运行)时,worker_id 将返回 "master"

此外,工作进程还定义了以下环境变量

  • PYTEST_XDIST_WORKER:工作进程的名称,例如,"gw2"

  • PYTEST_XDIST_WORKER_COUNT:本次会话中工作进程的总数,例如,当命令行中给出 -n 4 时,为 "4"

测试中的 worker_id 信息也存储在 TestReport 中,在 worker_id 属性下。

从工作进程访问主节点的 sys.argv

要访问传递给主节点命令行参数的 sys.argv,请使用 request.config.workerinput["mainargv"]

在 ini 文件中指定测试执行环境

您可以使用 pytest 的 ini 文件配置来避免输入常用选项。例如,您可以将使用三个子进程作为默认设置,如下所示

[pytest]
addopts = -n3

您还可以添加默认环境,如下所示

[pytest]
addopts = --tx ssh=myhost//python=python3.5 --tx ssh=myhost//python=python3.6

然后只需输入

pytest --dist=each

来在每个环境中运行测试。

在 ini 文件中指定“rsync”目录

在根项目目录中的 tox.inisetup.cfg 文件中,您可以指定在同步中包含或排除的目录

[pytest]
rsyncdirs = . mypkg helperpkg
rsyncignore = .hg

这些目录规范相对于配置文件所在的目录。

项目详情


下载文件

为您所在的平台下载文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。

源分布

pytest-xdist-debug-for-graingert-0.0.1.tar.gz (62.4 kB 查看哈希值)

上传时间

构建分布

pytest_xdist_debug_for_graingert-0.0.1-py2.py3-none-any.whl (35.5 kB 查看哈希值)

上传时间 Python 2 Python 3

支持者