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. 如果用例间有依赖的话,可以对被依赖和依赖的用例设置依赖关系
    @pytest.mark.dependency(name="test_name")
    @pytest.mark.dependency(depends=["test_name"])
    

验证

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

    def test_one():
    	pass
    
    def test_two():
        pass
    

    执行pytest test_1.py -v -n 2
    输出结果: test_one和test_two分别属于gw0 和gw1

    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文件内容

    @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

    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文件内容

    @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中并且按顺序执行

    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文件内容

    import pytest
    
    @pytest.mark.dependency(depends=["test_name"])
    def test_three():
    	pass
    

    修改test_1.py文件内容

    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状态

    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

     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
    

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

    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状态

要在pytest中实现多线程并发执行,可以使用pytest-xdist插件。pytest-xdist是一个分布式测试扩展,可以在多个进程和主机上并发运行测试。以下是使用pytest-xdist进行多线程并发执行的步骤: 1. 安装pytest-xdist插件。可以使用以下命令来安装: ``` pip install pytest-xdist ``` 2. 编写测试用。创建一个测试文件,并编写多个测试函数。 3. 运行测试用。使用以下命令来运行测试用: ``` pytest -n <num_processes> ``` `<num_processes>`参数指定要使用的进程数。如,如果要使用4个进程进行并发执行,可以运行: ``` pytest -n 4 ``` 4. 查看运行结果。pytest-xdist将在多个进程中并发运行测试用,并显示每个进程的执行结果。 注意事项: - pytest-xdist插件默认使用多线程并发执行,但也可以使用多进程。 - 在编写测试用,确保测试函数之间没有共享的状态或资源,以避免竞争条件和意外的结果。 - 多线程并发执行可能会导致测试用之间的相互影响,因此请谨慎使用并确保测试用之间的独立性。 - 如果测试用需要访问共享资源,可以使用线程同步机制(如锁)来确保线程安全。 - 并发执行可能会导致测试结果的不确定性,因为测试用执行顺序可能会发生变化。因此,在编写测试用,应该避免依赖于特定的执行顺序。 希望这些信息对你有帮助!如果你有任何其他问题,请随提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值