Pytest預期失敗需要使用@pytest.mark.xfail()
標記。
1、@pytest.mark.xfail()標記的作用
期望測試用例是失敗的,但是會執行此測試用例,並且也不會影響其他測試用例的的執行。(即xfail
標記並不會影響用例的執行)
如果預期失敗的測試用例執行失敗的則結果是xfail
(不會額外顯示出錯誤資訊)
如果測試用例執行成功的則結果是xpass
。
在報告中會將這些用例列在“預期失敗XFAIL
或意外傳遞XPASS
部分。
2、應用場景
- 你期望測試由於某種原因失敗。
如:用例功能不完善,或者用例執行一直失敗。 - 對尚未實現的功能進行測試時。
- 尚未修復的錯誤進行測試時。
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,執行此測試用例。strict
:strict
預設為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()
標識忽略掉。