前言
- 在日常功能测试用例非常多时,比如有1千条用例,假设每个用例执行需要1分钟,如果单个测试人员执行需要1000分钟才能跑完
- 当项目非常紧急时,会需要协调多个测试资源来把任务分成两部分,于是执行时间缩短一半,如果有10个小伙伴,那么执行时间就会变成十分之一,大大节省了测试时间
- 为了节省项目测试时间,10个测试同时并行测试,这就是分布式执行
-
同样道理,当我们自动化测试用例非常多的时候, 一条条按顺序执行会非常慢,
pytest-xdist的出现就是为了让自动化测试用例可以分布式执行,从而大大节省自动化测试执行的时间
-
pytest-xdist是属于进程级别的并发
分布式执行用例的设计原则(重点)
当然自动化测试用例要想能够分布式执行,还是要满足一些条件的:
-
用例之间相互独立
:保证用例之间没有依赖关系,用例可以完全独立运行 -
用例没有执行顺序
:保证随机顺序的执行用例都可正常执行 -
用例之间互不影响
:保证用例的运行结果不会影响到其他用例
插件介绍
-
目前支持Python的 v3.6 – 3.10 版本哦
-
官方文档地址:https://pypi.org/project/pytest-xdist/
特性(官方解释)
-
--looponfail
:在子进程中重复运行测试。每次运行后,pytest 都会等待项目中的文件发生更改,然后重新运行之前失败的测试。重复此过程,直到所有测试都通过,然后再次执行完整运行。 -
多平台
覆盖:您可以指定不同的 Python 解释器或不同的平台,并在所有平台上并行运行测试。在远程运行测试之前,
pytest
有效地将您的程序源代码“同步”到远程位置。您可以指定不同的 Python 版本和解释器。但是,它不会安装/同步依赖项。
注意
:这种模式的存在主要是为了向后兼容,因为现代开发依赖于多平台测试的持续集成。
插件安装
pip install pytest-xdist -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eiympqJq-1646038268207)(C:\Users\nowcoder\AppData\Roaming\Typora\typora-user-images\image-20220228151011102.png)]
快速入门
项目结构
相关代码
test_xdist.conftest.py
import pytest
@pytest.fixture(scope="session")
def pwd_login():
print("== 开始用例 ==")
name, pwd = "admin", "123456"
yield name, pwd
print("== 退出用例 ==")
test_xdist.test_01.py
from time import sleep
import pytest
@pytest.mark.parametrize("x", list(range(10)))
def test_index(pwd_login, x):
sleep(1)
print("首页用例", x)
test_xdist.test_module1.test_case1.py
from time import sleep
import pytest
@pytest.mark.parametrize("x", list(range(10)))
def test_func1(x):
sleep(1)
print("module1 测试用例-1",x)
test_xdist.test_module2.test_case2.py
from time import sleep
import pytest
@pytest.mark.parametrize("x", list(range(10)))
def test_func1(x):
sleep(1)
print("module2 测试用例-2", x)
test_xdist.test_module3.test_case3.py
from time import sleep
def test_func3():
sleep(1)
print("module3 测试用例-3")
不使用分布式执行
可以看到,每条用例sleep(1),一共31条用例,总共运行了31.44s
使用分布式执行
运行前cpu占用情况
运行中cpu占用情况
知识点
- 可以看到,最终运行时间只需要6s,我的电脑是真6核,假12核
- -n auto:可以自动检测到系统的CPU核数;从测试结果来看,检测到的是逻辑处理器的数量,即假12核
- 使用auto等于利用了所有CPU来跑用例,此时CPU占用率会特别高
拓展:指定执行用例CPU个数
要将测试发送到多个 CPU,请使用
-n
(或
--numprocesses
)选项
# 使用 -n 指定两个cpu 来运行用例
pytest -s -n 2
# 使用 --numprocesses 指定两个cpu 来运行用例
pytest -s -n 2
传递
-n auto
以使用与您的计算机具有 CPU 内核一样多的进程。这可能会导致相当大的速度提升,尤其是在您的测试套件需要大量时间的情况下
拓展:pytest-xdist指定用例运行顺序
xdist插件,支持使用
--dist
命令行选项控制用例的执行顺序
语法
pytest --dist [option]
# 或者使用 =
pytest --dist=[option]
知识点
-
--dist load
(默认)
: 将挂起的测试发送给任何可用的工作人员,没有任何保证的顺序 -
--dist loadscope
:测试按
模块
分组,用于
测试功能
,按
类
分组,用于
测试方法
。组作为一个整体分配给可用的工人。
这保证了一个组中的所有测试都在同一个进程中运行
。如果您有昂贵的模块级或类级设备,这将很有用。按类分组优先于按模块分组 -
--dist loadfile
:测试按其包含的文件分组。组作为一个整体分配给可用的工人。
这保证了一个文件中的所有测试都在同一个工作人员中运行
-
--dist loadgroup
:测试按
xdist_group
标记分组。组作为一个整体分配给可用的工人。
这保证了所有具有相同
xdist_group
名称的测试都在同一个 worker 中运行
-
--dist no
:正常的 pytest 执行模式,一次运行一个测试(根本没有分发)
举个🌰
@pytest.mark.xdist_group(name="group1")
def test1():
pass
class TestA:
@pytest.mark.xdist_group("group1")
def test2():
pass
这将确保
test1
和
TestA::test2
将在同一个 worker 中运行。没有
xdist_group
标记的测试像
--dist=load
模式一样正常分发执行