pytest 多进程,pytest多线程执行

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: