zoukankan      html  css  js  c++  java
  • pytest中执行测试用例的几个方法(xfail, xpass, repeat, --count,--repeat-scope)

    一.pytest.xfail &  @pytest.mark.xfail(raises=ErrorType)

    1.pytest.xfail:  将该用例标记成xfail失败,并且该用例中的后续代码不会执行

    在测试用例中调用pytes.xfail()方法,可以选择传入reason参数表示原因

    import pytest
    
    
    class TestMyPytest:
        """Pytest learning part one: @pytest.mark.xfail(raises = xx)"""
    
    
        def test_fun1(self):
            pytest.xfail(reason="no function body")
            print(f"After the xfail!")
            assert 1 == 4
    
        def test_fun2(self) -> None:
            assert True
    
    
    if __name__ == '__main__':
        pytest.main()

     这个方法是我们直接将用例标记为失败,那什么情况我们会这么做呢?功能未完成、已知有问题。除此之外,就是用例的执行需要前置条件或操作,如果前置条件或操作失败,那么我们就可以直接将该用例设为失败,也就是xfail

    2.@pytest.mark.xfail标签

    期望测试用例是失败的,但是不会影响测试用例的的执行。

    如果测试用例执行失败的则结果是xfail,不会额外显示出错误信息;如果测试用例执行成功的则结果是xpass。

    import pytest
    
    
    class TestMyPytest:
        """Pytest learning part one: @pytest.mark.xfail(raises = xx)"""
    
        @pytest.mark.xfail(raises=AssertionError)
        def test_fun1(self) -> None:
            assert 1 == 2
    
        def test_fun2(self) -> None:
            assert True
    
    
    if __name__ == '__main__':
        pytest.main()

    测试结果如下:收集了2个测试用例,标记的用例确实运行了;因为断言失败所以结果是xfailed,也没有像正常一样显示出错误用例及具体信

    如果运行成功,运行结果就是xpass.

    import pytest
    
    
    class TestMyPytest:
        """Pytest learning part one: @pytest.mark.xfail(raises = xx)"""
    
        @pytest.mark.xfail(raises=AssertionError)
        def test_fun1(self) -> None:
            assert 1 == 1
    
        def test_fun2(self) -> None:
            assert True
    
    
    if __name__ == '__main__':
      pytest.main(['-sv', 'test_rais_exce.py'])
    
    

    二、pytest.mark.repeat()

    1.重复执行某个测试用例

    背景:某个测试用例甚至整个测试重复执行多次。这时你可能会想到多写几次运行函数,再不就写个for循环。其实pytest提供了一个扩展模块:pytest-repeat模块

    安装:pip install pytest-repeat 

    作用:用@pytest.mark.repeat()标签,装饰测试用例,来实现该用例的重复执行多少次。

             repeat()中传入必选参数:重复执行的次数

     栗子:

    import pytest
    
    
    class TestMyPytest:
        """Pytest learning part one: @pytest.mark.xfail(raises = xx)"""
    
        @pytest.mark.repeat(3)
        def test_fun1(self):
            print("fun1 is running...")
            assert 1 == 1
    
        def test_fun2(self) -> None:
            assert True
    
    
    if __name__ == '__main__':
        pytest.main(['-sv', 'test_rais_exce.py'])

    运行结果如下:fun1用例被装饰repeat,执行3次

    2.重复执行测试类

    直接用@pytest.mark.repeat()标签装饰该测试类。

    注意:执行顺序是第一个用例执行N次,再执行下一个用例N次;而不是每个用例执行一次,共执行N轮。

    栗子:

    """Test class repeat n times"""
    
    import pytest
    
    
    @pytest.mark.repeat(2)
    class TestMyPytest:
        """Test class"""
    
        def test_fun1(self):
            print("fun1 is running...")
            assert 1 == 1
    
        def test_fun2(self):
            print("fun2 is running...")
            assert 2 == 2
    
    
    if __name__ == '__main__':
        pytest.main(['-sv', '重复测试类.py'])

    运行结果:第一条用例执行2次,再执行第二条用例,以此类推

     

    3.重复执行测试模块(.py文件)

    直接在模块上方(导入pytest包下面)加入下面一行代码:pytestmark=pytest.mark.repeat(2)

    (pytestmark是固定的)

    栗子:

    """Test module repeat n times"""
    
    import pytest
    pytestmark = pytest.mark.repeat(2)
    
    
    class TestMyPytest_1:
        """Test class"""
    
        def test_fun1(self):
            print("fun1 is running...")
            assert 1 == 1
    
        def test_fun2(self):
            print("fun2 is running...")
            assert 2 == 2
    
    
    class TestMyPytest_2:
        """Test Class 2"""
        def test_fun3(self):
            print("fun3 is running...")
            assert  3 == 3
    
    
    if __name__ == '__main__':
        pytest.main(['-sv', '重复测试模块.py'])

    运行结果:该模块.py中的所有类中的测试用例,都被执行了2次。(执行顺序也是第一条执行2次,再执行第二条,以此类推)

    三、--count 和 --repeat-scope实现重复执行测试

    1、--count方式:在运行函数(或命令行)中传入了参数: --count==执行次数 。

    栗子:

    """Test repeat n times"""
    
    import pytest
    
    
    class TestMyPytest_1:
        """Test class"""
    
        def test_fun1(self):
            print("fun1 is running...")
            assert 1 == 1
    
        def test_fun2(self):
            print("fun2 is running...")
            assert 2 == 2
    
    
    class TestMyPytest_2:
        """Test Class 2"""
        def test_fun3(self):
            print("fun3 is running...")
            assert 3 == 3
    
    
    if __name__ == '__main__':
        pytest.main(['-sv', '--count=2', 'count实现重复执行测试.py'])

    运行结果:运行顺序还是第一个用例执行N次,再执行下一个用例N次

     那么如何让每个用例都执行一次,共执行n次循环呢?-------–repeat-scope参数

    2.–repeat-scope

    参数有四个值的选择范围:

    function:以测试用例为单位,将测试用例重复执行N次;在执行下一个用例
    class:以测试类为单位,将类中的每个用例依次执行一遍,共执行N轮;再执行下一个测试类
    module:以模块为单位,将模块中的每个用例依次执行一遍,共执行N轮;再执行下一个模块
    session:以整个测试会话为单位,将会话中的每个用例依次执行一遍;共执行N轮
    栗子:设置--repeat-scope的参数为session

    """Test repeat n times"""
    
    import pytest
    
    
    class TestMyPytest_1:
        """Test class"""
    
        def test_fun1(self):
            print("fun1 is running...")
            assert 1 == 1
    
        def test_fun2(self):
            print("fun2 is running...")
            assert 2 == 2
    
    
    class TestMyPytest_2:
        """Test Class 2"""
        def test_fun3(self):
            print("fun3 is running...")
            assert 3 == 3
    
    
    if __name__ == '__main__':
        pytest.main(['-sv', '--count=2', '--repeat-scope=session', 'scope参数为session.py'])

    运行结果:如下每个用例执行一次,共循环2次

    栗子2:--repeat-scope=module,结果同上(一样的)

    栗子3:--repeat-scope=class,结果如下:以类为单位,先运行第一个类中的每个用例,每个运行一次,执行2次;同理再运行第二个类中的用例

     栗子4:--repeat-scope=function,结果如下,以function为单位

      

  • 相关阅读:
    tty初探 — uart驱动框架分析
    是否要从单片机转为嵌入式Linux?
    Linux 下Input系统应用编程实战
    Linux设备驱动之Kobject、Kset
    Xorg-xserver相关知识
    linux各级目录
    GitHub使用基本流程
    6、Linux发行版组成与初识
    CentOS7安装出现Warning
    Python数据类型之变量
  • 原文地址:https://www.cnblogs.com/ananmy/p/14525011.html
Copyright © 2011-2022 走看看