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为单位

  

原文地址:https://www.cnblogs.com/ananmy/p/14525011.html