pytest并发执行中设置用例执行顺序

场景

使用pytest-xdist实现测试用例的并发执行, 但是执行中部分用例需要设置执行顺序

需要的依赖包

pytest-order , pytest-xdist, pytest-dependency

实现方法

  1. 对执行顺序有要求的用例设置, 设置在同一个组中并且设置执行顺序,用例上设置@pytest.mark.xdist_group(name="group_name"), 并且执行时设置参数 -dist loadgroup , 就能保证group名字相同的用例在同一个worker中运行

  2. 然后对同一个group中的用例设置顺序,即@pytest.mark.order(1)

  3. 如果用例间有依赖的话,可以对被依赖和依赖的用例设置依赖关系

    python 复制代码
    @pytest.mark.dependency(name="test_name")
    @pytest.mark.dependency(depends=["test_name"])

验证

  1. 有一个文件test_1.py, 内容如下

    python 复制代码
    def test_one():
    	pass
    
    def test_two():
        pass

    执行pytest test_1.py -v -n 2

    输出结果: test_one和test_two分别属于gw0 和gw1

    shell 复制代码
    test_case/test_1.py::test_one
    test_case/test_1.py::test_two
    [gw0] [ 50%] PASSED test_case/test_1.py::test_one
    [gw1] [100%] PASSED test_case/test_1.py::test_two
  2. 添加group后test_1.py文件内容

    python 复制代码
    @pytest.mark.xdist_group(name="group_name")
    def test_one():
       pass
    
    @pytest.mark.xdist_group(name="group_name")
    def test_two():
        pass

    执行pytest test_1.py -v --dist loadgroup -n 2

    输出结果:test_one和test_two属于同一个worker gw0

    shell 复制代码
    test_case/test_1.py::test_one@group_name
    [gw0] [ 50%] PASSED test_case/test_1.py::test_one@group_name
    test_case/test_1.py::test_two@group_name
    [gw0] [100%] PASSED test_case/test_1.py::test_two@group_name
  3. 添加执行顺序后test_1.py文件内容

    python 复制代码
    @pytest.mark.xdist_group(name="group_name")
    @pytest.mark.order(2)
    def test_one():
      pass
    
    @pytest.mark.xdist_group(name="group_name")
    @pytest.mark.order(1)
    def test_two():
       pass

    执行pytest test_1.py -v --dist loadgroup -n 2

    输出结果: 用例在gw0中并且按顺序执行

    shell 复制代码
    test_case/test_1.py::test_two@group_name
    [gw0] [ 50%] PASSED test_case/test_1.py::test_two@group_name
    test_case/test_1.py::test_one@group_name
    [gw0] [100%] PASSED test_case/test_1.py::test_one@group_name
  4. 新建文件test_2.py文件内容

    python 复制代码
    import pytest
    
    @pytest.mark.dependency(depends=["test_name"])
    def test_three():
    	pass

    修改test_1.py文件内容

    python 复制代码
    import pytest
    
    @pytest.mark.dependency(name="test name")
    @pytest.mark.xdist_group(name="group_name")
    @pytest.mark.order(2)
    def test_one():
    	pass
    
    @pytest.mark.xdist_group(name="group_name")
    @pytest.mark.order(1)
    def test_two():
    	pass

    执行结果如下, test_three是skipped状态

    shell 复制代码
    test_case/test_1.py::test_two@group_name
    test_case/test_2.py::test_three
    [gw1] [ 33%] SKIPPED test_case/test_2.py::test_three
    [gw0] [ 66%] PASSED test_case/test_1.py::test_two@group_name
    test_case/test_1.py::test_one@group_name
    [gw0] [100%] PASSED test_case/test_1.py::test_one@group_name

    修改一下test_2.py

    python 复制代码
     import pytest
    
     @pytest.mark.xdist_group(name="group_name")
     @pytest.mark.dependency(depends=["test name"],scope='session')
     @pytest.mark.order(3)
     def test_three():
     	pass

    再次执行结果, 按指定顺序执行

    shell 复制代码
    test_case/test_1.py::test_two@group_name
    [gw0] [ 33%] PASSED test_case/test_1.py::test_two@group_name
    test_case/test_1.py::test_one@group_name
    [gw0] [ 66%] PASSED test_case/test_1.py::test_one@group_name
    test_case/test_2.py::test_three@group_name
    [gw0] [100%] PASSED test_case/test_2.py::test_three@group_name

经验之谈: 对于dependency不建议多用,用例设计的时候就需要考虑用例之间解耦,特别是对于UI自动化,为了保证通过率,需要设置失败重新运行,如果设置的依赖,很有可能出现被依赖的用例执行成功,但是依赖的用例是skipped状态

相关推荐
nuclear201116 分钟前
使用Python 在Excel中创建和取消数据分组 - 详解
python·excel数据分组·创建excel分组·excel分类汇总·excel嵌套分组·excel大纲级别·取消excel分组
Lucky小小吴31 分钟前
有关django、python版本、sqlite3版本冲突问题
python·django·sqlite
GIS 数据栈1 小时前
每日一书 《基于ArcGIS的Python编程秘笈》
开发语言·python·arcgis
爱分享的码瑞哥1 小时前
Python爬虫中的IP封禁问题及其解决方案
爬虫·python·tcp/ip
傻啦嘿哟2 小时前
如何使用 Python 开发一个简单的文本数据转换为 Excel 工具
开发语言·python·excel
B站计算机毕业设计超人2 小时前
计算机毕业设计SparkStreaming+Kafka旅游推荐系统 旅游景点客流量预测 旅游可视化 旅游大数据 Hive数据仓库 机器学习 深度学习
大数据·数据仓库·hadoop·python·kafka·课程设计·数据可视化
IT古董3 小时前
【人工智能】Python在机器学习与人工智能中的应用
开发语言·人工智能·python·机器学习
湫ccc3 小时前
《Python基础》之pip换国内镜像源
开发语言·python·pip
hakesashou3 小时前
Python中常用的函数介绍
java·网络·python
菜鸟的人工智能之路3 小时前
极坐标气泡图:医学数据分析的可视化新视角
python·数据分析·健康医疗