• pytest扫盲11--xfail参数详解


    xfail 函数文档如下:

        def xfail(self,condition=None, reason=None, raises=None, run=True, strict=False):
            """mark the the test function as an expected failure if eval(self,condition)
            has a True value.  # 将eval(self,condition)为真的测试函数标记为失败。
    
            Optionally specify a reason for better reporting and run=False if
            you don't even want to execute the test function.  # 不想执行某个测试功能,可以指定 run=False,可以自定义错误原因 reason=‘’
    
            See http://doc.pytest.org/en/latest/skipping.html  # 官方文档说明
            """

    xfail 作用:

      1)xfail意味着你期望测试由于某种原因失败。常见的示例是对尚未实现的功能或尚未修复的错误进行测试。

      2)当预期失败时(标记为pytest.mark.xfail),但实际测试通过,标记为xpass用 x 标记代替 F,但无错误信息输出,将在测试摘要中报告

      3)使用 pytest.xfail(reason) 从用例中强制标记测试。

      4)通过 -r 显示 xfail、skip 详细信息   pytest -r

         5)忽略xfail:

    pytest --runxfail

    1)直接使用 @pytest.mark.xfail

    # File  : test_demo_10_xfail.py
    # IDE   : PyCharm
    
    import pytest
    
    def division(a, b):
        return int(a / b)
    
    @pytest.mark.xfail
    @pytest.mark.parametrize('a, b, c', [(4, 2, 2), (0, 2, 0), pytest.param(1, 0, 0, marks=pytest.mark.xfail), (6, 8, 0)], ids=['整除', '被除数为0', '除数为0', '非整除'])
    def test_1(a, b, c):
        res = division(a, b)
        assert res == c

    执行(使用xfail标记的用例仍然会执行):

    • xfailed  为失败的用例,小写 x
    • xpassed  为通过的用例,大写 X
    E:personalpython38python.exe E:/personal/GitWorkSpace/pytest_basic/main.py
    test_demo_10_xfail.py::test_1[整除]
    test_demo_10_xfail.py::test_1[被除数为0]
    test_demo_10_xfail.py::test_1[除数为0]
    test_demo_10_xfail.py::test_1[非整除]
    XXxX
    1 xfailed, 3 xpassed in 0.12s
    
    Process finished with exit code 0

    2)condition  为False执行标记的代码块,True则标记 xpass

    @pytest.mark.xfail(condition=True, reason='xfail标记')
    @pytest.mark.parametrize('a, b, c', [(4, 2, 2), (0, 2, 0), pytest.param(1, 0, 0, marks=pytest.mark.xfail), (6, 8, 0)], ids=['整除', '被除数为0', '除数为0', '非整除'])
    def test_1(a, b, c):
        res = division(a, b)
        assert res == c

    执行:

    E:personalpython38python.exe E:/personal/GitWorkSpace/pytest_basic/main.py
    test_demo_10_xfail.py::test_1[整除]
    test_demo_10_xfail.py::test_1[被除数为0]
    test_demo_10_xfail.py::test_1[除数为0]
    test_demo_10_xfail.py::test_1[非整除]
    test_demo_10_xfail.py::test_2
    XXxX.
    1 passed, 1 xfailed, 3 xpassed in 0.14s
    
    Process finished with exit code 0

    3)raises  具体原因,python标准错误类型,可以在raises参数中指定单个异常或异常组

    • 如果测试失败且没有提到指定的异常,则报告failed
    • 如果测试失败,raises 报告的异常与失败异常一致,则标记为 xfailed
    @pytest.mark.xfail(raises=AssertionError)
    def test_03():
        assert 3 == 4
    
    @pytest.mark.xfail(raises=ValueError)
    def test_04():
        if isinstance('1234', int) is False:
            raise TypeError("传入参数非整数")
    E:personalpython38python.exe E:/personal/GitWorkSpace/pytest_basic/main.py
    test_demo_10_xfail.py::test_03
    test_demo_10_xfail.py::test_04
    xF
    ================================== FAILURES ===================================
    ___________________________________ test_04 ___________________________________
    
        @pytest.mark.xfail(raises=ValueError)
        def test_04():
            if isinstance('1234', int) is False:
    >           raise TypeError("传入参数非整数")
    E           TypeError: 传入参数非整数
    
    test_demo_10_xfail.py:41: TypeError
    =========================== short test summary info ===========================
    FAILED test_demo_10_xfail.py::test_04 - TypeError: 传入参数非整数
    1 failed, 1 xfailed in 0.14s
    
    Process finished with exit code 0

    4)run=False 直接标记为xfail,且不执行,防止在xfail死循环(默认为True执行用例)

    @pytest.mark.xfail(run=False)
    @pytest.mark.parametrize('a, b, c', [(4, 2, 2), (0, 2, 0), pytest.param(1, 0, 0, marks=pytest.mark.xfail), (6, 8, 0)], ids=['整除', '被除数为0', '除数为0', '非整除'])
    def test_1(a, b, c):
        res = division(a, b)
        assert res == c
    E:personalpython38python.exe E:/personal/GitWorkSpace/pytest_basic/main.py
    test_demo_10_xfail.py::test_1[整除]
    test_demo_10_xfail.py::test_1[被除数为0]
    test_demo_10_xfail.py::test_1[除数为0]
    test_demo_10_xfail.py::test_1[非整除]
    xxxx
    4 xfailed in 0.27s
    
    Process finished with exit code 0

    5)strict=True  会使产生了 xpass 的用例,标记为测试失败(默认False则标记通过)

    @pytest.mark.xfail(strict=True)
    def test_05():
        assert 3 == 3

    执行结果(只要 strict=True 的用例均会失败):

    E:personalpython38python.exe E:/personal/GitWorkSpace/pytest_basic/main.py
    test_demo_10_xfail.py::test_05
    F
    ================================== FAILURES ===================================
    ___________________________________ test_05 ___________________________________
    [XPASS(strict)] 
    =========================== short test summary info ===========================
    FAILED test_demo_10_xfail.py::test_05
    1 failed in 0.07s
    
    Process finished with exit code 0

    5)在 parametrize 中使用  marks=pytest.mark.xfail

    @pytest.mark.parametrize('a, b, c', [(4, 2, 2), (0, 2, 0), pytest.param(1, 0, 0, marks=pytest.mark.xfail), (6, 8, 0)], ids=['整除', '被除数为0', '除数为0', '非整除'])
    def test_1(a, b, c):
        res = division(a, b)
        assert res == c
    E:personalpython38python.exe E:/personal/GitWorkSpace/pytest_basic/main.py
    test_demo_10.py::test_1[整除]
    test_demo_10.py::test_1[被除数为0]
    test_demo_10.py::test_1[除数为0]
    test_demo_10.py::test_1[非整除]
    ..x.
    3 passed, 1 xfailed in 0.14s
    喜时之言,多失信;怒时之言,多失体
  • 相关阅读:
    C#中使用MATLAB
    各种插值法及效果图对比
    Visual Studio中你所不知道的智能感知
    C#中使用Surfer
    XCode中连接使用GitHub
    个人作业Week1
    个人作业Week3
    个人作业Week2
    第一次作业——subway
    执行ajax加载页面中的js总结
  • 原文地址:https://www.cnblogs.com/xiaohuboke/p/13533601.html
Copyright © 2020-2023  润新知