网站建设金手指排名稳定,seo教程百度云,湖南益阳新增本土确诊0例,成都装饰公司目录#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结#xff08;尾部小惊喜#xff09; 前言
平常我们功能测试… 目录导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结尾部小惊喜 前言
平常我们功能测试用例非常多时比如有1千条用例假设每个用例执行需要1分钟如果单个测试人员执行需要1000分钟才能跑完
当项目非常紧急时会需要协调多个测试资源来把任务分成两部分于是执行时间缩短一半如果有10个小伙伴那么执行时间就会变成十分之一大大节省了测试时间
为了节省项目测试时间10个测试同时并行测试这就是一种分布式场景
分布式执行用例的原则 用例之间是独立的没有依赖关系完全可以独立运行 用例执行没有顺序要求随机顺序都能正常执行 每个用例都能重复运行运行结果不会影响其他用例
背景
我们日常的工作当中进行自动化测试编写的测试用例会非常多测试用例一个一个的执行所需要花费的时间会很长。
想象一下如果开发改动一块代码我们需要回归一下这时候执行一下自动化用例需要花费一小时或者好几个小时的时间这是我们无法容忍的。
为了解决这个问题我们采用pytest的插件pytest-xdist来进行多进程的并发执行测试用例大大的缩短测试用例的执行时间提高效率。
并发运行测试用例
1、安装pytest-xdist
pip install pytest-xdist2、多进程并发执行测试用例不支持多线程
pytest test_add.py -n NUM # NUM表示并发的进程数参数配置
-n* *代表进程数
说明 ①多cpu并行执行用例直接加个-n参数即可后面num参数就是并行数量比如num设置为3 ②-n auto 自动侦测系统里的CPU数目 ③-n num 指定运行测试的处理器进程数
3、举例
项目结构如下 代码
# file_name: test_a.py
import pytest
import timedef test_a_01():print(----------------- test_a_01)time.sleep(1)assert 1def test_a_02():print(----------------- test_a_02)time.sleep(1)assert 1def test_a_03():print(----------------- test_a_03)time.sleep(1)assert 1def test_a_04():print(----------------- test_a_04)time.sleep(1)assert 1if __name__ __main__:pytest.main([-s, test_a.py])# file_name: test_b.py
import pytest
import timedef test_b_01():print(----------------- test_b_01)time.sleep(1)assert 1def test_b_02():print(----------------- test_b_02)time.sleep(1)assert 1def test_b_03():print(----------------- test_b_03)time.sleep(1)assert 1def test_b_04():print(----------------- test_b_04)time.sleep(1)assert 1if __name__ __main__:pytest.main([-s, test_b.py])①正常运行以上代码耗时8.09s ②设置并行运行数量为4耗时3.48s大大的缩短了测试用例的执行时间。 pytest-xdist分布式测试的原理
xdist的分布式类似于一主多从的结构master机负责下发命令控制slave机slave机根据master机的命令执行特定测试任务。
在xdist中主是master从是workers。
大致原理
1、xdist会产生一个或多个workersworkers都通过master来控制。
2、每个worker负责执行完整的测试用例集然后按照master的要求运行测试而master机不执行测试任务。
pytest-xdist分布式测试的流程
第一步创建worker
master会在总测试会话test session开始前产生一个或多个worker。 master和worker之间是通过execnet和网关来通信的。 实际编译执行测试代码的worker可能是本地机器也可能是远程机器。
第二步收集测试项用例
每个worker类似一个迷你型的pytest执行器。 worker会执行一个完整的test collection过程。【收集所有测试用例的过程】 然后把测试用例的ids返回给master。【ids表示收集到的测试用例路径】 master是不会执行任何测试用例集的。
注意分布式测试pytest-xdist方式执行测试时不会输出测试用例中的print内容因为主机并不执行测试用例pycharm相当于一个master。
第三步master检测workers收集到的测试用例集
master接收到所有worker收集的测试用例集之后master会进行一些完整性检查以确保所有worker都收集到一样的测试用例集包括顺序。
如果检查通过会将测试用例的ids列表转换成简单的索引列表每个索引对应一个测试用例的在原来测试集中的位置。
这个方案可行的原因是所有的节点都保存着相同的测试用例集。
并且使用这种方式可以节省带宽因为master只需要告知workers需要执行的测试用例对应的索引而不用告知完整的测试用例信息。
第四步测试用例分发
–dist-mode选项
eachmaster将完整的测试索引列表分发到每个worker。
loadmaster将大约25%的测试用例以轮询的方式分发到各个worker剩余的测试用例则会等待workers执行完测试用例以后再分发
注意可以使用pytest_xdist_make_scheduler 这个hook来实现自定义测试分发逻辑。
第五步测试用例的执行
workers 重写了 pytest_runtestloop pytest的默认实现是循环执行所有在test session这个对象里面收集到的测试用例。
但是在xdist里, workers实际上是等待master为其发送需要执行的测试用例。 当worker收到测试任务, 就顺序执行 pytest_runtest_protocol 。
值得注意的一个细节是workers 必须始终保持至少一个测试用例在的任务队列里, 以兼容 pytest_runtest_protocol(item, nextitem) hook的参数要求为了将 nextitem传给hook。
worker会在执行最后一个测试项前等待master的更多指令。
如果它收到了更多测试项, 那么就可以安全的执行 pytest_runtest_protocol 因为这时nextitem参数已经可以确定。
如果它收到一个 shutdown信号, 那么就将 nextitem 参数设为 None, 然后执行 pytest_runtest_protocol
第六步测试用例再分发–dist-modeload
当workers开始/结束执行时会把测试结果返回给master这样其他pytest hook比如 pytest_runtest_protocol就可以正常执行。
master在worker执行完一个测试后基于测试执行时长以及每个work剩余测试用例综合决定是否向这个worker发送更多的测试用例
第七步测试结束
当master没有更多执行测试任务时它会发送一个“shutdown”信号给所有worker。 当worker将剩余测试用例执行完后退出进程。 master等待所有worker全部退出。 然而此时仍需要处理诸如 pytest_runtest_logreport 等事件。
pytest实现多线程运行测试用例pytest-parallel
安装
pip install pytest-parallel常用参数配置
① --workersn 多进程运行需要加此参数 n是进程数。默认为1 ② --tests-per-workern 多线程需要添加此参数n是线程数
如果两个参数都配置了就是进程并行每个进程最多n个线程总线程数进程数*线程数
注意
①在windows上进程数永远为1。 ②需要使用 if name “main” :在dos中运行会报错即在命令行窗口运行测试用例会报错
示例
pytest test.py --workers 3 3个进程运行 pytest test.py --tests-per-worker 44个线程运行 pytest test.py --workers 2 --tests-per-worker 4 2个进程并行且每个进程最多4个线程运行即总共最多8个线程运行。
import pytestdef test_03():print(测试用例3操作)def test_04():print(测试用例4操作)if __name__ __main__:pytest.main([-s, test_b.py, --workers2, --tests-per-worker4])pytest-parallel与pytest-xdist对比说明
① pytest-parallel 比 pytst-xdist 相对好用功能支持多。 ② pytst-xdist 不支持多线程 ③pytest-parallel 支持python3.6及以上版本所以如果想做多进程并发在linux或者mac上做在Windows上不起作用Workers1如果做多线程linux/mac/windows平台都支持进程数为workers的值。
下面是我整理的2023年最全的软件测试工程师学习知识架构体系图
一、Python编程入门到精通 二、接口自动化项目实战 三、Web自动化项目实战 四、App自动化项目实战 五、一线大厂简历 六、测试开发DevOps体系 七、常用自动化测试工具 八、JMeter性能测试 九、总结尾部小惊喜
无论遇到多少困难和挫折都不能放弃自己的梦想。要相信自己有无限的潜力和能力勇敢地追求自己的梦想不断超越自我最终就能够取得成功。
成功并不是一种目的而是一种过程。勇敢地追求梦想不断地超越自我坚持不懈地努力下去最终就能够实现自己的价值。
每个人都有自己独特的价值要勇敢地追求自己的梦想坚持不懈地努力下去不断提升自己的能力最终就能够实现自己的价值。