『德不孤』Pytest框架 — 7、Pytest預期失敗

繁華似錦Fighting發表於2022-02-27

Pytest預期失敗需要使用@pytest.mark.xfail()標記。

1、@pytest.mark.xfail()標記的作用

期望測試用例是失敗的,但是會執行此測試用例,並且也不會影響其他測試用例的的執行。(即xfail標記並不會影響用例的執行)

如果預期失敗的測試用例執行失敗的則結果是xfail(不會額外顯示出錯誤資訊)

如果測試用例執行成功的則結果是xpass

在報告中會將這些用例列在“預期失敗XFAIL或意外傳遞XPASS部分。

2、應用場景

  1. 你期望測試由於某種原因失敗。
    如:用例功能不完善,或者用例執行一直失敗。
  2. 對尚未實現的功能進行測試時。
  3. 尚未修復的錯誤進行測試時。

3、語法引數說明

如下所示:

@pytest.mark.xfail(self,condition=None, reason=None, raises=None, run=True, strict=False)

  • condition: 如果滿足條件則標記用例執行失敗, 預設為True
    說明:condition表示預期結果,然後用例實際執行的結果,與預期結果對比,會出現4種測試結果狀態。
    failed, passed, xfailed, xpassed
    提示:condition可以等於True或者False,也可以等於一個表示式,如:condition=1>2等。
  • reason:說明用例標記為預期失敗的原因, 預設為None。(必填)
  • raises=None:在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("傳入引數非整數")
    
    一般很少這樣用,會使用pytest.raises先丟擲介面異常,再斷言異常資訊是否符合預期。
  • run:標識是否執行此用例, 若為True則執行,若為False則用例不執行用例,直接標記該用力為XFAIL,(防止在xfail死迴圈。)
    預設為True,執行此測試用例。
  • strictstrict預設為False。當strict=True時,如果測試用例被標識為xpass,則把該用例標識為失敗fail
    我們也可以不修改strict屬性值,在全域性配置檔案pytest.ini中新增一行配置:xfail_strict=true即可,作用是一樣的。

4、示例

"""
1.學習目標
    瞭解預期失敗方法
2.操作步驟
    2.1 xfail(condition,reason)
        condition:當condition條件為真,用例標記失敗
        reason: 原因

3.使用xfail標識用例可能出現的情況:
    條件     用例執行結果   測試結果
    True     False          FAILED
    True     True           PASSED
    False    False          XFAIL
    False    True           XPASS

"""
# 1.匯入pytest
import pytest


# 2.編寫測試用例
# 預期失敗,結果失敗
@pytest.mark.xfail(True, reason="該功能尚未完成")
def test_case_1():
    print("預期失敗,結果失敗")
    pytest.xfail()
    assert False


# 預期失敗,結果成功
@pytest.mark.xfail(True, reason="該功能尚未計劃")
def test_case_2():
    print("預期失敗,結果成功")
    assert True


# 預期成功,結果失敗
@pytest.mark.xfail(False, reason="")
def test_case_3():
    print("預期成功,結果失敗")
    assert False


# 預期成功,結果成功
@pytest.mark.xfail(False, reason="")
def test_case_4():
    print("預期成功,結果成功")
    assert True


if __name__ == '__main__':
    pytest.main()

"""
執行結果:
test_01.py::test_case_1 預期失敗,結果失敗
XFAIL
test_01.py::test_case_2 預期失敗,結果成功
XPASS (該功能尚未計劃)
test_01.py::test_case_3 預期成功,結果失敗
FAILED
test_01.py::test_case_4 預期成功,結果成功
PASSED

============== 1 failed, 1 passed, 1 xfailed, 1 xpassed in 0.09s ==============


說明:
x(小寫x)預期失敗,結果失敗   1 xfailed(預期失敗)
X(大寫X)預期失敗,結果成功   1 xpassed(預期成功)
F預期成功,結果失敗   1 failed
.預期成功,結果成功   1 passed
在測試執行過程中,會將xpassed狀態的用例直接轉成failed狀態
"""

5、忽略xfail標識

執行命令:pytest --runxfail,也就是--runxfail引數可以將全部@pytest.mark.xfail()標識忽略掉。

相關文章