【Python_pytest】pytest-xdist 分布式执行

pytest-xdist 是属于进程级别的并发

分布式执行用例的原则:

  • 用例之间是独立的,没有依赖关系,完全可以独立运行
  • 用例执行没有顺序要求,随机顺序都能正常执行,不影响其它用例
  • 每个用例都能重复运行,运行结果不会影响其他用例

 

安装

pip install pytest-xdist

 

不使用pytest-xdist 

python -v

 

 

使用pytest-xdist 

pytest -v -n num  # num表示并发的进程数 

 

  参数 -n auto:可以自动检测到系统的CPU核数。即利用了所有CPU来跑用例;

  参数 -n num:指定num个进程跑同时执行用例

 

  执行顺序

--dist=loadscope
# 将按照同一个模块 module 下的函数和同一个测试类 class 下的方法来分组,然后将每个测试组发给可以执行的 worker,确保同一个组的测试用例在同一个进程中执行。目前无法自定义分组,按类 class 分组优先于按模块 module 分组。

--dist=loadfile
# 按照同一个文件名来分组,然后将每个测试组发给可以执行的 worker,确保同一个组的测试用例在同一个进程中执行。

 

# -*- coding: UTF-8 -*-
import sys
import os
import json
import time
from loguru import logger as logs



class TestXdist:
    """测试用例模块"""

    def setup_class(self):
        logs.info('>>> 测试环境:sit')
        logs.info(">>> 自动化数据开关: on.")
        logs.info('>>>  从execl第1行开始,共执行测试用例共1行 ')


    def teardown_class(self):
        logs.info(">>> 当前测试类所有测试用例执行完毕 ~")

    @pytest.mark.run(order=0)
    def test_demo1(self):
        logs.info(datetime.datetime.now())
        time.sleep(5)
        logs.info(datetime.datetime.now())

    @pytest.mark.run(order=1)
    def test_demo2(self):
        logs.info(datetime.datetime.now())
        time.sleep(5)
        logs.info(datetime.datetime.now())

    @pytest.mark.run(order=2)
    def test_demo3(self):
        logs.info(datetime.datetime.now())
        time.sleep(5)
        logs.info(datetime.datetime.now())



if __name__ == "__main__":
    logs.debug("pytest")

    pytest.main(["test_xdist.py::TestXdist",        # "运行文件名"::"类名"::"方法名"
                 public_tools.get_html('test_debug'),       # "生成html报告参数"
                 "--self-contained-html",  # 把css样式合并到html里 仅生成html文件
                 "-v",  # 日志打印 -q仅报告 -s仅控制台, -v 报告及控制台
                 "-n 3 ",    # 不使用则注释掉,多进程并发 -s不使用分布式测试; -n后+num
                 "--color=yes",  # pytest 写入输出颜色
                 '-W', 'ignore:Module already imported:pytest.PytestWarning',       # 忽略错误
                 ])
示例

 

执行结果

  

 

pytest-xdist分布式测试的流程
  第一步:创建worker
  第二步:收集测试项用例
    <Tips:分布式测试(pytest-xdist)方式执行测试时不会输出测试用例中的print内容>
  第三步:master检测workers收集到的测试用例集
  第四步:测试用例分发
    --dist-mode选项
      each:master将完整的测试索引列表分发到每个worker。
      load:master将大约25%的测试用例以轮询的方式分发到各个worker,剩余的测试用例则会等待workers执行完测试用例以后再分发
    <Tips:自定义分发逻辑可以使用:pytest_xdist_make_scheduler>
  第五步:测试用例的执行
  第六步:测试用例再分发(--dist-mode=load)
  第七步:测试结束

 

 

 

参考地址:https://www.cnblogs.com/hls-code/p/14978726.html

posted @ 2022-12-05 16:53  Phoenixy  阅读(241)  评论(0)    收藏  举报