前置條件:
1.文件路徑:
- Test_App - - test_abc.py - - pytest.ini
2.pyetst.ini配置文件內容:
[pytest] 命令行參數 addopts = -s 搜索文件名 python_files = test_*.py 搜索的類名 python_classes = Test_* 搜索的函數名 python_functions = test_*
3.1 跳過測試函數
根據特定的條件,不執行標識的測試函數. 方法: skipif(condition, reason=None) 參數: condition:跳過的條件,必傳參數 reason:標注原因,必傳參數 使用方法: @pytest.mark.skipif(condition, reason="xxx")
import pytest class Test_ABC: def setup_class(self): print("------->setup_class") def teardown_class(self): print("------->teardown_class") def test_a(self): print("------->test_a") assert 1 @pytest.mark.skipif(condition=2 > 1, reason="跳過該函數") # 跳過測試函數test_b def test_b(self): print("------->test_b") assert 0
3.2
@pytest.mark.skip(reason=" ") -- 跳過執行測試函數
可傳入一個非必須參數reason表示原因
import pytest @pytest.mark.skip(reason="no reason") def test_01(): print("---用例a執行---") class Test_Case(): @pytest.mark.skip(reason="no reason") def test_02(self): print("---用例b執行---") def test_03(self): print("---用例c執行---")
3.3
自定義@pytest.mark.skip()標簽
myskip = pytest.mark.skip() 或 myskip = pytest.mark.skipif(condition=...)
裝飾時用該變量代替標簽即可:@myskip
import pytest # myskip = pytest.mark.skip() myskip = pytest.mark.skipif(condition=2>1, reason="no reason") @myskip def test_01(): print("---用例a執行---") class Test_Case(): @myskip def test_02(self): print("---用例b執行---") def test_03(self): print("---用例c執行---")
3.4
通過pytest.skip()方法跳過測試函數
import pytest def test_01(): pytest.skip(msg="no reason") print("---用例a執行---") class Test_Case(): def test_02(self): pytest.skip() print("---用例b執行---") def test_03(self): print("---用例c執行---")
3.5
跳過測試類
跳過測試類其實和跳過測試方法一樣,使用@pytest.mark.skip()和@pytest.mark.skipif()兩個標簽,用他們裝飾測試類就好啦。
根據某些條件跳過模塊中的所有測試用例如:
pytestmark = pytest.mark.skipif(sys.platform == "win32",reason="tests for linux only")
import pytest myskip = pytest.mark.skip(reason="no reason") def test_01(): print("---用例a執行---") @myskip class Test_Case(): def test_02(self): print("---用例b執行---") def test_03(self): print("---用例c執行---")
3.6
跳過模塊
使用pytestmark(不可更改變量名)變量,讓他等於標簽即可。
import pytest #pytestmark = pytest.mark.skip() pytestmark = pytest.mark.skip(reason='no reason') def test_01(): print("---用例a執行---") class Test_Case(): def test_02(self): print("---用例b執行---") def test_03(self): print("---用例c執行---")
4.1 標記為預期失敗函數
標記測試函數為失敗函數 方法: xfail(condition=None, reason=None, raises=None, run=True, strict=False) 常用參數: condition:預期失敗的條件,必傳參數 reason:失敗的原因,必傳參數 使用方法: @pytest.mark.xfail(condition, reason="xx")
import pytest class Test_ABC: def setup_class(self): print("------->setup_class") def teardown_class(self): print("------->teardown_class") def test_a(self): print("------->test_a") assert 1 @pytest.mark.xfail(2 > 1, reason="標注為預期失敗") # 標記為預期失敗函數test_b def test_b(self): print("------->test_b") assert 0
x # 失敗標記
4.2使用xfail標記指示你希望測試失敗:
@pytest.mark.xfail def test_function(): ...
import pytest class Test_ABC: def test_a(self): print("------->test_a") assert 1 @pytest.mark.xfail def test_b(self): print("------->test_b") assert 0
將運行此測試,但在失敗時不會報告回溯。相反,終端報告會將其列在“預期失敗”(XFAIL
)或“意外傳遞”(XPASS
)部分中。
或者,也可以xfail在測試用例或setup函數中強制標記測試預期失敗:
def test_function(): if not valid_config(): pytest.xfail("failing configuration (but should work)")
import pytest class Test_ABC: def test_a(self): print("------->test_a") assert 1 def test_b(self): if 2>1: pytest.xfail("failing configuration (but should work)") print("------->test_b")
】
這將無條件地制作test_function``XFAIL
。請注意,pytest.xfail
調用后不會執行其他代碼,與標記不同。那是因為它是通過引發已知異常在內部實現的。
4.3 strict參數(默認是false)
如果strict參數設置為True, 如果出現xpass,測試套件的結果將視為失敗。:
@pytest.mark.xfail(strict=True) def test_function(): ...
import pytest class Test_ABC: def test_a(self,b=1): print("------->test_a") assert 1 @pytest.mark.xfail(strict=True) def test_b(self): print("------->test_b") assert 1
這將導致`xpass(“意外通過”)此測試的結果導致測試套件失敗。
strict參數也可以使用xfail_strict變量配置到pytest.ini文件中。:
[pytest] xfail_strict=true
4.4 reason參數
與skipif一樣,你也可以在特定平台上標記你對失敗的期望:
@pytest.mark.xfail(sys.version_info >= (3,6),reason="Python3.6 API變更") def test_function(): ...
4.5 raises參數
如果你想更具體地說明測試失敗的原因,可以在raises
參數中指定單個異常或異常元組。
@pytest.mark.xfail(raises=RuntimeError) def test_function(): ...
4.6 忽略xfail
通過在命令行上指定:
pytest --runxfail
可以強制運行並報告xfail
標記的測試,就像它根本沒有標記一樣。這也導致pytest.xfail
沒有效果。
import pytest class Test_ABC: def test_a(self,b=1): print("------->test_a") assert 1 @pytest.mark.xfail def test_b(self): print("------->test_b") assert 1