pytest xdist插件,用于分布式测试和循环失败的模式
项目描述
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.ini 或 setup.cfg 文件中,您可以指定在同步中包含或排除的目录
[pytest]
rsyncdirs = . mypkg helperpkg
rsyncignore = .hg
这些目录规范相对于配置文件所在的目录。
项目详情
pytest-xdist-debug-for-graingert-0.0.1.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | acc1542d0173f541eaacb046a1978058d0fa6f37a843019be00c022f50981528 |
|
MD5 | cda27f4930a18031f3563d63ca7bbdf5 |
|
BLAKE2b-256 | 0b43186b079d121a6c862858a6b45fa8e03d520943f2ceb65c8432545b6273f0 |
pytest_xdist_debug_for_graingert-0.0.1-py2.py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | a2b1a769f57c7717a0cb2424dacd0ddb7b741e6d31bf2f99b25d1cf8af1f081e |
|
MD5 | ca31ef4cb347682039f8ea189c1a2e99 |
|
BLAKE2b-256 | d81159a17dab844652eb2aacbe39a6a5b082711a119791b75032206f6c20a302 |