【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)
第七步:测试结束
-------------------------------------------------------------------------------------
如果万事开头难 那请结局一定圆满 @ Phoenixy
-------------------------------------------------------------------------------------
浙公网安备 33010602011771号