一、前言

测试环境不稳定偶发接口超时(和服务无关,纯粹是环境问题),然后执行接口case也因此偶发失败。比如同一个接口case跑五次,其中有两次失败,另外三次都是成功的,这种偶发性的环境问题就需要我们手动重跑(还不一定能够通过)。有没有一个比较好的机制,保证case能够尽最大努力通过测试呢?

这里我们介绍pytest的一个失败重跑插件:pytest-rerunfailures。

二、学习目标

1.pytest-rerunfailures安装

2.pytest-rerunfailures应用

三、知识点

1.【pytest-rerunfailures安装】

插件安装:

pip install pytest-rerunfailures

2.【pytest-rerunfailures应用】

使用方式有两种:

  • 命令行参数

    • 语法:

      pytest --reruns 3 --reruns-delay 1 test_demo.py 
      #3是重试次数,1是每次间隔1秒
      pytest --reruns 3 --only-rerun AssertionError --only-rerun ValueError test_demo.py 
      #也可以指定异常类型重跑,其中多个--only-rerun之间是或的关系
      
    • 代码示例:

      #测试用例文件test_XXX.py
      class TestCase():
      
          def test_01(self):
              print("---用例1执行---")
              assert False
      
    • 运行效果:

      test_demo.py:8: AssertionError
      ----------------------------------------------- Captured stdout call ----------------------------------------------------
      ---用例1执行---
      ----------------------------------------------- Captured stdout call ----------------------------------------------------
      ---用例1执行---
      ------------------------------------------------Captured stdout call ----------------------------------------------------
      ---用例1执行---
      -----------------------------------------------Captured stdout call -----------------------------------------------------
      ---用例1执行---
      ================================ short test summary info ====================================
      FAILED test_demo.py::TestCase::test_01 - assert False
      ==================================== 1 failed, 3 rerun in 3.08s ==========================================
      

      用例失败后又重试运行了三次。

  • 装饰器方式

    • 语法:

      @pytest.mark.flaky(reruns=3, reruns_delay=1)#3是重试次数,1是每次间隔1秒
      
    • 代码示例:

      import pytest
      
      class TestCase():
      
          @pytest.mark.flaky(reruns=3, reruns_delay=1)
          def test_01(self):
              print("---用例1执行---")
              assert False
      
    • 运行效果:

      test_demo.py::TestCase::test_01 RERUN                                    [100%]
      test_demo.py::TestCase::test_01 RERUN                                    [100%]
      test_demo.py::TestCase::test_01 RERUN                                    [100%]
      test_demo.py::TestCase::test_01 FAILED                                   [100%]---用例1执行---
      ---用例1执行---
      ---用例1执行---
      ---用例1执行---
      FAILED test_demo.py::TestCase::test_01 - assert False
      ========================= 1 failed, 3 rerun in 3.06s ==========================
      

      用例失败后又重试运行了三次。

  • 注意:

    不可以与类,模块还有包级别的fixture装饰器一起使用: @pytest.fixture()
    该插件与pytest-xdist的 --looponfail 标志不兼容
    该插件在使用pdb调试时候会有不兼容性
    最后总结,这个插件虽然还用,但是坑还是不少,建议主要使用失败重试次数和重试间隔的功能即可。