zoukankan      html  css  js  c++  java
  • pytest---用例失败重跑

    前言

      以前出去面试的时候,经常会遇到一个问题,你的自动化如果根据一些网络原因,环境问题导致的用例失败,怎么进行失败重跑呢?以前用的unittest,没有自动的失败重跑内容,但是强大的pytest中有一个插件功能就能轻松帮助我们解决这个问题。

    pytest-rerunfailures

    pytest-rerunfailures是属于pytest的插件,通常用来执行用例失败后重新执行。

    安装: pip install pytest-rerunfailures 

    源码:https://github.com/pytest-dev/pytest-rerunfailures

    其中pytest-rerunfailures有2种用法,一种是装饰器的方法,另一种是命令行参数的方法。

    装饰器

    首先介绍下,如何通过装饰器的方法进行用例失败重跑。

    格式: @pytest.mark.flaky(reruns=3, reruns_delay=2)  

    使用方法和前面介绍的一些基本相似通过pytest.mark的形式加上flakey方法。我们看到其中有2个参数,其中reruns表示失败后执行几次,reruns_delay表示失败后等待几秒后,在重新执行

    装饰器的方法不仅可以加到用例上,也可以加入到类上。

    装饰器在用例上

    import pytest
    import random
    
    class Test01:
    
        @pytest.mark.flaky(reruns=3, reruns_delay=2)
        def test_01(self):
            a = random.randint(0, 3)
            print('---用例01---')
            print(a)
            assert a == 2
    
        def test_02(self):
            print('---用例02---')
            assert 1 == 1
    
    if __name__ == '__main__':
        pytest.main(['-vs'])

    通过下图可以看到,我们执行用例1一共执行了3次,第一次设置的随机值为1和断言2不一致,进行重新跑,第2次随机值为0和断言2也不一样,第3次的时候断言相同了,用例通过

    装饰器在类上

    import pytest
    import random
    
    @pytest.mark.flaky(reruns=3, reruns_delay=2)
    class Test01:
    
        def test_01(self):
            a = random.randint(0, 2)
            print('---用例01---')
            print('用例01中的a:%s'%a)
            assert a == 2
    
        def test_02(self):
            c = random.randint(0, 2)
            print('---用例02---')
            print('用例02中的c:%s'%c)
            assert c == 1
    
    if __name__ == '__main__':
        pytest.main(['-vs'])

    通过下方执行结果可以很清楚的看到,我们class下的用例都进行了失败重跑。

    命令行参数

    上述方法介绍了如何通过装饰器的方法进行用例失败重跑,下面介绍如何通过命令行的参数进行失败重跑。

    格式: pytest --reruns 3 --reruns-delay 2 或 pytest -vs --reruns=3 --reruns-delay=2 

    参数详解:其中reruns空格3 表示失败重新运行3次,reruns-delay空格2 表示重新执行需要等待2秒。这里也可以使用等于来进行表示

    import pytest
    import random
    
    class Test01:
    
        def test_01(self):
            a = random.randint(0, 2)
            print('---用例01---')
            print('用例01中的a:%s'%a)
            assert a == 2
    
        def test_02(self):
            c = random.randint(0, 2)
            print('---用例02---')
            print('用例02中的c:%s'%c)
            assert c == 1
    
    if __name__ == '__main__':
        pytest.main(['-vs'])

    通过下图执行结果可以看出来,失败重跑已经生效。

    注意事项:装饰器的方法和命令行的方法不能一起使用,不然的话会报错!!!

    简单的通过实例介绍了用例失败重跑的两种方法,具体哪种方法好用,这个要看个人的喜好了。不过安静还是推荐使用命令行参数。

  • 相关阅读:
    [C#] 走进异步编程的世界
    [C#] C# 知识回顾
    [C#] 走进异步编程的世界
    [C#] 走进异步编程的世界
    [.Net] 手把手带你将自己打造的类库丢到 NuGet 上
    [.NET] WebApi 生成帮助文档及顺便自动创建简单的测试工具
    [C#] Linq To Objects
    [C#] Linq To Objects
    T-SQL:毕业生出门需知系列(九)
    TortoiseGit:记住用户名和密码
  • 原文地址:https://www.cnblogs.com/qican/p/14303208.html
Copyright © 2011-2022 走看看