pytest 多进程,pytest多线程执行
Pytest多进程运行测试用例(pytest-xdist) pytest实现多线程运行测试用例(pytest-parallel)_ MB 62 af F3 AFB 54 FB _ 51 CTO的技术博客
Pytest多线程运行测试用例(pytest-xdist) pytest实现多线程运行测试用例(pytest-parallel)
Pytest-XDIST前言通常情况下,我们有大量的功能测试用例,比如有1000个测试用例,假设每个测试用例需要1分钟来执行。如果单个测试人员运行需要1000分钟,当项目非常紧急时,就需要协调多个测试资源将任务分成两部分,这样执行时间会缩短一半。如果有10个小伙伴,那么执行时间就变成了十分之一,大大节省了测试时间。为了节省项目的测试时间,10个测试同时并行测试。这是分布式场景中分布式执行案例的原则:
用例是独立的,没有依赖性,可以独立运行。用例的执行没有顺序要求,每个用例都可以按照随机的顺序正常执行。运行结果不会影响其他用例的后台:在我们的日常工作中,会有很多为自动化测试而编写的测试用例,需要很长的时间来逐个执行这些测试用例。想象一下,如果一段代码被开发和更改,我们需要返回。此时,执行自动化用例需要一个小时或几个小时,这是。
针对这一问题,我们使用pytest的插件pytest-xdist并发执行多进程测试用例,大大缩短了测试用例的执行时间,提高了效率。
运行并发测试用例:1。安装pytest-xdist。
安装pytest-xdist2,多进程并发执行测试用例:不支持多线程。
Pytest test_add.py -n NUM # NUM表示并发进程的数量参数配置:
-n=*: *表示进程的数量。
解释:
多cpu并行执行用例,直接加个-n参数就行了,后面的num参数就是并行数,比如num设为3。
-n auto:自动检测系统中CPU的数量。
-n num:指定运行测试的处理器进程数。
3.例如:
项目结构如下:
代码:
#文件名:测试_a.py
导入pytest
导入时间
定义测试_a_01():
打印(-测试_a_01 )
时间.睡眠(1)
断言1
定义测试_a_02():
打印(-测试_a_02 )
时间.睡眠(1)
断言1
定义测试_a_03():
打印(-测试_a_03 )
时间.睡眠(1)
断言1
定义测试_a_04():
打印(-测试_a_04 )
时间.睡眠(1)
断言1
if __name__==__main__ :
pytest.main([-s , test_a.py])#文件名:test_b.py
导入pytest
导入时间
定义测试_b_01():
打印(-测试_b_01 )
时间.睡眠(1)
断言1
定义测试_b_02():
打印(-测试_b_02 )
时间.睡眠(1)
断言1
定义测试_b_03():
打印(-测试_b_03 )
时间.睡眠(1)
断言1
定义测试_b_04():
打印(-测试_b_04 )
时间.睡眠(1)
断言1
if __name__==__main__ :
Test.main ([-s , test _ b.py]) 正常运行上述代码,耗时8.09s
设置并行运行次数为4需要3.48s,大大缩短了测试用例的执行时间。
pytest-xdist分布式测试原理。xdist的分布类似于一主多从的结构。主机负责发布命令和控制从机。从机根据主机的命令执行特定的测试任务。
2.在xdist中,主人是主人,奴隶是工人。
原理一:xdist会生成一个或多个workerss,所有worker都由master控制。
2.每个工人负责执行完整的测试用例集,然后按照主机的要求运行测试,而主机不执行测试任务。
pytest-xdist分布式测试过程的第一步:创建worker1和master将在总测试会话开始之前产生一个或多个worker。
2.主站和从站之间的通信是通过execnet和网关进行的。
3.实际编译和执行测试代码的工作人员可能是本地机器,也可能是远程机器。
第二步:收集测试项目和用例。1.每个工作者都类似于一个迷你pytest执行器。
2.工人将执行一个完整的测试收集过程。[收集所有测试用例的过程]
3.然后将测试用例的id返回给主测试用例。[ids表示收集的测试用例路径]
4.主模块将不执行任何测试用例集。
注意:分布式测试(pytest-xdist)方法不会输出测试用例中的打印内容,因为主机不执行测试用例,pycharm相当于一个主机。步骤3: master检测工作人员收集的测试用例集。1.在主设备收到所有工人收集的测试用例集后,主设备将进行一些完整性检查,以确保所有工人都收集了相同的测试用例集(包括订单)。
2.如果检查通过,测试用例的ids列表将被转换成一个简单的索引列表,每个索引对应一个测试用例在原始测试集中的位置。
3.这个方案可行的原因是所有节点持有相同的测试用例集。
4.并且使用这种方法可以节省带宽,因为master只需要通知workers要执行的测试用例对应的索引,而不需要告知完整的测试用例信息。
步骤4:测试用例分布- dist-mode选项
每个:主人将完整的测试索引列表分发给每个工人。
Load:master通过轮询的方式将大约25%的测试用例分配给每个worker,其余的测试用例将在worker执行完测试用例后进行分配。
注意:您可以使用钩子pytest_xdist_make_scheduler来实现定制的测试分布逻辑。步骤5:测试用例1的执行。workers重写了pytest _ runtestloop:pytest的默认实现是循环执行测试会话对象中收集的所有测试用例。
2.但是,在xdist中,工作人员实际上是在等待主设备发送测试用例来执行。
3.当worker收到测试任务时,它将依次执行pytest_runtest_protocol。
4.一个值得注意的细节是,工作人员必须始终在任务队列中保留至少一个测试用例,以符合pytest _ runtest _ protocol (item,nextitem) hook的参数要求,才能将nextitem传递给hook。
5.在执行最后一个测试项目之前,工人将等待主人的更多指示。
6.如果它接收到更多的测试项,它可以安全地执行pytest_runtest_protocol,因为nextitem参数已经可以确定了。
7.如果它接收到“关闭”信号,则将nextitem参数设置为None,然后执行pytest_runtest_protocol
步骤6:测试用例的重新分配。当workers开始/结束执行时,测试结果会返回给master,这样其他pytest钩子如pytest_runtest_protocol就可以正常执行了。
2.在一个工人执行一个测试后,主基于测试执行时间和每个工作的剩余测试用例,综合决定是否向工人发送更多的测试用例。
步骤7:测试1结束。当主控器没有更多测试任务要执行时,它将向所有工作器发送“关机”信号。
2.当工作人员执行完剩余的测试用例时,他退出流程。
3.主设备等待所有工人退出。
4.但是,此时仍需要处理pytest_runtest_logreport等事件。
Pytest实现多线程运行测试用例(pytest-parallel)安装pip安装pytest-parallel常用参数配置-workers=n:多进程运行需要添加该参数,n为进程数。默认值为1。
-tests-per-worker=n:多线程需要添加该参数,n为线程数。
如果两个参数都配置了,则该过程是并行的;每个进程最多有N个线程,线程总数为:进程数*线程数
[注意]
在windows上,进程数始终为1。
如果name=="main ":是必需的,并且在dos下运行会出错(即在命令行窗口运行测试用例会出错)
示例:
Pytest.py-workers 3: 3流程运行。
py test . py-每工作线程测试数4: 4线程运行
pytest . py-workers 2-tests-per-worker 4:两个进程并行,每个进程最多运行四个线程,即总共最多运行八个线程。
导入pytest
定义测试_03():
打印(“测试案例3操作”)
定义测试_04():
打印(“测试用例4操作”)
if __name__==__main__ :
Test.main ([-s , test _ b.py ,-workers=2 ,-tests-per-worker=4 ])py test-parallel与pytest-xdist进行比较。pytest-parallel比pytst-xdist好用,功能支持更多。
pytst-xdist不支持多线程;
pytest-parallel支持python3.6及以上版本,所以如果想做多进程,在linux或mac上做,在Windows上就不行了(Workers=1)。多线程linux/mac/windows平台支持的话,进程数就是workers的值。
期待陌生,拥抱惊喜。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。