深入了解Python中Pytest Markers的使用方法
Markers有啥用?
當使用 Pytest 運行測試時,可以通過標記(Markers)來為測試函數(shù)或類添加自定義的元數(shù)據(jù)。標記可以用于對測試進行分類、過濾和定制化。
查看所有Markers
pytest --markers
常用的內(nèi)置標記
內(nèi)置標記(Built-in Markers): Pytest 提供了一些內(nèi)置的標記,用于常見的測試場景。一些常用的內(nèi)置標記包括:
@pytest.mark.skip: 標記該測試為跳過;@pytest.mark.parametrize: 標記該測試使用參數(shù)化,可以為測試函數(shù)指定多組參數(shù);@pytest.mark.xfail: 標記該測試為預期失敗;@pytest.mark.skipif: 根據(jù)條件動態(tài)地跳過某個測試。@pytest.mark.timeout:為測試用例設置運行超時時間。
@pytest.mark.skip
可以設置一個可選參數(shù)reason,表明跳過的原因
import pytest ? @pytest.mark.skip() def test_01(): ? ?pass
未增加跳過原因,輸出內(nèi)容為
test_demo.py::test_01 SKIPPED (unconditional skip) [100%]
Skipped: unconditional skip
我們增加跳過原因,看看輸出結(jié)果
import pytest ? @pytest.mark.skip(reason='skip reason') def test_01(): ? ?pass
執(zhí)行輸出結(jié)果如下
test_demo.py::test_01 SKIPPED (skip reason) [100%] Skipped: skip reason
可以看到會直接顯示具體原因。
pytest.skip方法
這里我們順帶提一下這個方法??梢栽跍y試執(zhí)行期間強制跳過
def test_01(): ? ?pytest.skip(reason="skip reason")
另外,還可以為其設置一個布爾型的參數(shù)allow_module_level(默認為False),表明是否允許在模塊中調(diào)用這種方法,如果置為True,則跳過模塊中剩余的部分,也就是說其值為True時這個模塊中所有測試方法都被跳過。
import sys
import pytest
?
if not sys.platform.startswith("darwin"):
?pytest.skip("如果不是mac,跳過",allow_module_level = True)注意:如果是在用例中設置allow_module_level為True,并不會跳過模塊中剩余的用例
@pytest.mark.skipif
帶條件的跳過執(zhí)行:滿足條件就跳過,不滿足條件就不跳過
import pytest
?
env = 'iOS'
?
@pytest.mark.skipif('env == "iOS"', reason="iOS不支持")
def test_01():
? ?pass當然也可以使用多條標記
import pytest
import sys
?
env = 'iOS1'
?
?
@pytest.mark.skipif('env == "iOS"', reason="iOS不支持")
@pytest.mark.skipif(sys.version_info<(3,12), reason="3.12以下版本不支持")
def test_01():
? ?pass可以看到第一個條件不滿足,我電腦的版本為3.8,第二個條件滿足,最終case跳過。
注意:當一個用例指定了多個skipif條件時,只需滿足其中一個,就可以跳過這個用例的執(zhí)行。
當然也可以在一個文件中定義所有的條件,需要時引入即可
import pytest import sys ? version = pytest.mark.skipif(sys.version_info<(3,12), reason="3.12以下版本不支持") ? @version def test_01(): ? ?pass
這里不存在pytest.skipif()方法
@pytest.mark.xfail
表示期望這個用例執(zhí)行失敗。用例會正常執(zhí)行,只是失敗時不再顯示堆棧信息,最終的結(jié)果有兩個:用例執(zhí)行失敗(XFAIL:符合預期的失?。⒂美龍?zhí)行成功(XPASS:不符合預期的成功)。也就是說執(zhí)行成功反倒不正確了。
import pytest ? @pytest.mark.xfail(reason = '預期失敗') def test_01(): ? ?assert 1 == 2
運行結(jié)果
test_demo.py::test_01 XFAIL (預期失敗) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [100%] @pytest.mark.xfail(reason = '預期失敗') ? def test_01(): > ? ? ? assert 1 == 2 E ? ? ? assert 1 == 2 ? test_demo.py:5: AssertionError ?
如果斷言改成1 != 2,該用例會執(zhí)行成功,本來標記該功能有bug,但是斷言成功了,說明斷言或者功能有問題,此時會標記為XPASS
當然也可以增加條件
import pytest import sys ? @pytest.mark.xfail(sys.version_info<(3,12), reason = '預期失敗') def test_01(): ? ?assert 1 != 2
如果我們想要將XPASS標記的記為失敗,可以使用strict參數(shù)
strict為關鍵字參數(shù),默認值為False。當strict=False時,如果用例執(zhí)行失敗,則結(jié)果標記為XFAIL,表示符合預期的失敗。如果用例執(zhí)行成功,則結(jié)果標記為XPASS,表示不符合預期的成功。當strict=True時,如果用例執(zhí)行成功,則結(jié)果將標記為FAILED,而不再標記為XPASS。
也可以直接在pytest.ini文件中配置
[pytest] xfail_strict = true
如果想要將標記為XFAIL的用例不再執(zhí)行,包含run參數(shù)。run為關鍵字參數(shù),默認值為True。當run=False時,pytest不會再執(zhí)行測試用例,而直接將結(jié)果標記為XFAIL。
import pytest ? @pytest.mark.xfail(reason = '預期失敗', run=False) def test_01(): ? ?assert 1 == 2
執(zhí)行發(fā)現(xiàn),會帶[NOTRUN]
raises為關鍵字參數(shù),默認值為None??梢灾付橐粋€異常類或者多個異常類的元組,表明我們期望用例上報指定的異常。pytest.mark.xfail()也可以接收一個raises參數(shù),用來判斷用例是否因為一個具體的異常而導致失敗
xfail標記如何失效
通過--runxfail參數(shù)讓xfail標記失效。通過命令行選項pytest --runxfail讓xfail標記失效,使這些用例變成正常執(zhí)行的用例,仿佛沒有被標記過一樣。同樣,pytest.xfail()方法也將失效。
@pytest.mark.parametrize
參數(shù)化內(nèi)容比較多,準備專門寫一篇來介紹。
自定義標記
標記用例,在命令行通過-m運行指定標記的用例
test_demo.py
import pytest ? @pytest.mark.p0 def test_01(): ? ?assert 1 != 2 ? ? @pytest.mark.p1 def test_02(): ? ?assert 1 != 2
運行所有:pytest -v test_demo.py
運行p0:pytest -v -m 'p0' test_demo.py
運行p0/p1:pytest -v -m 'p0 and p1' test_demo.py
執(zhí)行后,會發(fā)現(xiàn)有警告信息PytestUnknownMarkWarning,你可以忽略。想要解決的話,也可以在配置文件中配置自定義的標記,配置后警告信息會消失。
pytest.ini
[pytest] markers = ? ?p0: 冒煙 ? ?p1: 功能
再次執(zhí)行,會發(fā)現(xiàn)已經(jīng)沒有警告信息了。
當然也可以像這樣反向運行,運行不是p0的測試用例:pytest -v -m 'not p0' test_demo.py
自定義標記可以通過 pytest_configure(config)鉤子 函數(shù)在配置階段添加。下面是一個自定義標記的例子:
def pytest_configure(config): ? ?config.addinivalue_line( ? ? ? ?'markers', ? ? ? ?'repeat(n): run the given test function `n` times.') ?
在上面的例子中,我們定義了一個自定義標記 repeat,并將其添加到 pytest_configure() 函數(shù)中。然后,我們可以在測試函數(shù)上使用 @pytest.mark.repeat 標記來標記需要重復執(zhí)行的測試用例。
最后
通過使用標記,我們可以更靈活地控制測試的行為,并根據(jù)需要對不同類型的測試進行分類、過濾和定制化處理。
以上就是深入了解Python中Pytest Markers的使用方法的詳細內(nèi)容,更多關于Python Pytest Markers使用的資料請關注腳本之家其它相關文章!
相關文章
詳解Python中最常用的10個內(nèi)置函數(shù)
Python作為一種多用途編程語言,擁有豐富的內(nèi)置函數(shù)庫,這些函數(shù)可以極大地提高開發(fā)效率,本文將介紹Python中最常用的10個內(nèi)置函數(shù),我們將深入了解每個函數(shù),并提供示例代碼以幫助您更好地理解它們,需要的朋友可以參考下2023-11-11
java中兩個byte數(shù)組實現(xiàn)合并的示例
今天小編就為大家分享一篇java中兩個byte數(shù)組實現(xiàn)合并的示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05
Python數(shù)據(jù)預處理時缺失值的不同處理方式總結(jié)
在使用python做數(shù)據(jù)分析的時候,經(jīng)常需要先對數(shù)據(jù)做統(tǒng)一化的處理,缺失值的處理是經(jīng)常會使用到的。今天介紹的是使用差補法/均值/固定值等不同的方式完成數(shù)據(jù)填充從而保證數(shù)據(jù)的完整性,感興趣的可以了解一下2022-12-12
Python使用Selenium實現(xiàn)淘寶搶單的流程分析
這篇文章主要介紹了Python使用Selenium實現(xiàn)淘寶搶單的流程分析,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06
Python使用gTTS實現(xiàn)文本轉(zhuǎn)語音的終極指南
gTTS是一款基于Google翻譯API的Python文本轉(zhuǎn)語音庫,支持100+種語言,只需幾行代碼即可生成MP3語音文件,下面我們就來看看它的具體應用吧2026-05-05

