深入了解Python中Pytest Markers的使用方法
Markers有啥用?
當(dāng)使用 Pytest 運(yùn)行測(cè)試時(shí),可以通過(guò)標(biāo)記(Markers)來(lái)為測(cè)試函數(shù)或類(lèi)添加自定義的元數(shù)據(jù)。標(biāo)記可以用于對(duì)測(cè)試進(jìn)行分類(lèi)、過(guò)濾和定制化。
查看所有Markers
pytest --markers
常用的內(nèi)置標(biāo)記
內(nèi)置標(biāo)記(Built-in Markers): Pytest 提供了一些內(nèi)置的標(biāo)記,用于常見(jiàn)的測(cè)試場(chǎng)景。一些常用的內(nèi)置標(biāo)記包括:
@pytest.mark.skip
: 標(biāo)記該測(cè)試為跳過(guò);@pytest.mark.parametrize
: 標(biāo)記該測(cè)試使用參數(shù)化,可以為測(cè)試函數(shù)指定多組參數(shù);@pytest.mark.xfail
: 標(biāo)記該測(cè)試為預(yù)期失??;@pytest.mark.skipif
: 根據(jù)條件動(dòng)態(tài)地跳過(guò)某個(gè)測(cè)試。@pytest.mark.timeout
:為測(cè)試用例設(shè)置運(yùn)行超時(shí)時(shí)間。
@pytest.mark.skip
可以設(shè)置一個(gè)可選參數(shù)reason,表明跳過(guò)的原因
import pytest ? @pytest.mark.skip() def test_01(): ? ?pass
未增加跳過(guò)原因,輸出內(nèi)容為
test_demo.py::test_01 SKIPPED (unconditional skip) [100%]
Skipped: unconditional skip
我們?cè)黾犹^(guò)原因,看看輸出結(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
可以看到會(huì)直接顯示具體原因。
pytest.skip方法
這里我們順帶提一下這個(gè)方法。可以在測(cè)試執(zhí)行期間強(qiáng)制跳過(guò)
def test_01(): ? ?pytest.skip(reason="skip reason")
另外,還可以為其設(shè)置一個(gè)布爾型的參數(shù)allow_module_level(默認(rèn)為False),表明是否允許在模塊中調(diào)用這種方法,如果置為T(mén)rue,則跳過(guò)模塊中剩余的部分,也就是說(shuō)其值為T(mén)rue時(shí)這個(gè)模塊中所有測(cè)試方法都被跳過(guò)。
import sys import pytest ? if not sys.platform.startswith("darwin"): ?pytest.skip("如果不是mac,跳過(guò)",allow_module_level = True)
注意:如果是在用例中設(shè)置allow_module_level為T(mén)rue,并不會(huì)跳過(guò)模塊中剩余的用例
@pytest.mark.skipif
帶條件的跳過(guò)執(zhí)行:滿足條件就跳過(guò),不滿足條件就不跳過(guò)
import pytest ? env = 'iOS' ? @pytest.mark.skipif('env == "iOS"', reason="iOS不支持") def test_01(): ? ?pass
當(dāng)然也可以使用多條標(biāo)記
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
可以看到第一個(gè)條件不滿足,我電腦的版本為3.8,第二個(gè)條件滿足,最終case
跳過(guò)。
注意:當(dāng)一個(gè)用例指定了多個(gè)skipif條件時(shí),只需滿足其中一個(gè),就可以跳過(guò)這個(gè)用例的執(zhí)行。
當(dāng)然也可以在一個(gè)文件中定義所有的條件,需要時(shí)引入即可
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
表示期望這個(gè)用例執(zhí)行失敗。用例會(huì)正常執(zhí)行,只是失敗時(shí)不再顯示堆棧信息,最終的結(jié)果有兩個(gè):用例執(zhí)行失?。╔FAIL:符合預(yù)期的失敗)、用例執(zhí)行成功(XPASS:不符合預(yù)期的成功)。也就是說(shuō)執(zhí)行成功反倒不正確了。
import pytest ? @pytest.mark.xfail(reason = '預(yù)期失敗') def test_01(): ? ?assert 1 == 2
運(yùn)行結(jié)果
test_demo.py::test_01 XFAIL (預(yù)期失敗) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [100%] @pytest.mark.xfail(reason = '預(yù)期失敗') ? def test_01(): > ? ? ? assert 1 == 2 E ? ? ? assert 1 == 2 ? test_demo.py:5: AssertionError ?
如果斷言改成1 != 2
,該用例會(huì)執(zhí)行成功,本來(lái)標(biāo)記該功能有bug,但是斷言成功了,說(shuō)明斷言或者功能有問(wèn)題,此時(shí)會(huì)標(biāo)記為XPASS
當(dāng)然也可以增加條件
import pytest import sys ? @pytest.mark.xfail(sys.version_info<(3,12), reason = '預(yù)期失敗') def test_01(): ? ?assert 1 != 2
如果我們想要將XPASS
標(biāo)記的記為失敗,可以使用strict
參數(shù)
strict為關(guān)鍵字參數(shù),默認(rèn)值為False。當(dāng)strict=False時(shí),如果用例執(zhí)行失敗,則結(jié)果標(biāo)記為XFAIL,表示符合預(yù)期的失敗。如果用例執(zhí)行成功,則結(jié)果標(biāo)記為XPASS,表示不符合預(yù)期的成功。當(dāng)strict=True時(shí),如果用例執(zhí)行成功,則結(jié)果將標(biāo)記為FAILED,而不再標(biāo)記為XPASS。
也可以直接在pytest.ini
文件中配置
[pytest] xfail_strict = true
如果想要將標(biāo)記為XFAIL的用例不再執(zhí)行,包含run參數(shù)。run為關(guān)鍵字參數(shù),默認(rèn)值為T(mén)rue。當(dāng)run=False時(shí),pytest不會(huì)再執(zhí)行測(cè)試用例,而直接將結(jié)果標(biāo)記為XFAIL。
import pytest ? @pytest.mark.xfail(reason = '預(yù)期失敗', run=False) def test_01(): ? ?assert 1 == 2
執(zhí)行發(fā)現(xiàn),會(huì)帶[NOTRUN]
raises為關(guān)鍵字參數(shù),默認(rèn)值為None。可以指定為一個(gè)異常類(lèi)或者多個(gè)異常類(lèi)的元組,表明我們期望用例上報(bào)指定的異常。pytest.mark.xfail()也可以接收一個(gè)raises參數(shù),用來(lái)判斷用例是否因?yàn)橐粋€(gè)具體的異常而導(dǎo)致失敗
xfail標(biāo)記如何失效
通過(guò)--runxfail參數(shù)讓xfail標(biāo)記失效。通過(guò)命令行選項(xiàng)pytest --runxfail讓xfail標(biāo)記失效,使這些用例變成正常執(zhí)行的用例,仿佛沒(méi)有被標(biāo)記過(guò)一樣。同樣,pytest.xfail()方法也將失效。
@pytest.mark.parametrize
參數(shù)化內(nèi)容比較多,準(zhǔn)備專(zhuān)門(mén)寫(xiě)一篇來(lái)介紹。
自定義標(biāo)記
標(biāo)記用例,在命令行通過(guò)-m
運(yùn)行指定標(biāo)記的用例
test_demo.py
import pytest ? @pytest.mark.p0 def test_01(): ? ?assert 1 != 2 ? ? @pytest.mark.p1 def test_02(): ? ?assert 1 != 2
運(yùn)行所有:pytest -v test_demo.py
運(yùn)行p0
:pytest -v -m 'p0' test_demo.py
運(yùn)行p0/p1
:pytest -v -m 'p0 and p1' test_demo.py
執(zhí)行后,會(huì)發(fā)現(xiàn)有警告信息PytestUnknownMarkWarning
,你可以忽略。想要解決的話,也可以在配置文件中配置自定義的標(biāo)記,配置后警告信息會(huì)消失。
pytest.ini
[pytest] markers = ? ?p0: 冒煙 ? ?p1: 功能
再次執(zhí)行,會(huì)發(fā)現(xiàn)已經(jīng)沒(méi)有警告信息了。
當(dāng)然也可以像這樣反向運(yùn)行,運(yùn)行不是p0
的測(cè)試用例:pytest -v -m 'not p0' test_demo.py
自定義標(biāo)記可以通過(guò) pytest_configure(config)
鉤子 函數(shù)在配置階段添加。下面是一個(gè)自定義標(biāo)記的例子:
def pytest_configure(config): ? ?config.addinivalue_line( ? ? ? ?'markers', ? ? ? ?'repeat(n): run the given test function `n` times.') ?
在上面的例子中,我們定義了一個(gè)自定義標(biāo)記 repeat
,并將其添加到 pytest_configure()
函數(shù)中。然后,我們可以在測(cè)試函數(shù)上使用 @pytest.mark.repeat
標(biāo)記來(lái)標(biāo)記需要重復(fù)執(zhí)行的測(cè)試用例。
最后
通過(guò)使用標(biāo)記,我們可以更靈活地控制測(cè)試的行為,并根據(jù)需要對(duì)不同類(lèi)型的測(cè)試進(jìn)行分類(lèi)、過(guò)濾和定制化處理。
以上就是深入了解Python中Pytest Markers的使用方法的詳細(xì)內(nèi)容,更多關(guān)于Python Pytest Markers使用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python將Office文檔(Word、Excel、PDF、PPT)轉(zhuǎn)為OFD格式的實(shí)現(xiàn)方法
OFD(Open Fixed-layout Document )是我國(guó)自主制定的一種開(kāi)放版式文件格式標(biāo)準(zhǔn),如果想要通過(guò)Python將Office文檔(如Word、Excel或PowerPoint)及PDF文檔轉(zhuǎn)換為OFD格式,可以參考本文中提供的實(shí)現(xiàn)方法,需要的朋友可以參考下2024-06-06100 個(gè) Python 小例子(練習(xí)題二)
這篇文章主要繼續(xù)上一篇文章100 個(gè) Python 小例子(練習(xí)題一)來(lái)完成100 個(gè) Python 小例子,本文包括字母識(shí)詞、反向輸出II、表轉(zhuǎn)字符串、設(shè)置輸出顏色、算素?cái)?shù)等例子,需要的朋友可以參考一下2021-10-10Pytorch基本變量類(lèi)型FloatTensor與Variable用法
今天小編就為大家分享一篇Pytorch基本變量類(lèi)型FloatTensor與Variable用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01python re庫(kù)的正則表達(dá)式入門(mén)學(xué)習(xí)教程
這篇文章主要給大家介紹了關(guān)于python re庫(kù)的正則表達(dá)式的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03Python xml、字典、json、類(lèi)四種數(shù)據(jù)類(lèi)型如何實(shí)現(xiàn)互相轉(zhuǎn)換
這篇文章主要介紹了Python xml、字典、json、類(lèi)四種數(shù)據(jù)類(lèi)型如何實(shí)現(xiàn)互相轉(zhuǎn)換,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05python簡(jiǎn)單實(shí)現(xiàn)矩陣的乘,加,轉(zhuǎn)置和逆運(yùn)算示例
這篇文章主要介紹了python簡(jiǎn)單實(shí)現(xiàn)矩陣的乘,加,轉(zhuǎn)置和逆運(yùn)算,結(jié)合實(shí)例形式分析了Python針對(duì)矩陣的乘,加,轉(zhuǎn)置和求逆等運(yùn)算相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-07-07Python之print函數(shù)里逗號(hào)和加號(hào)的區(qū)別及說(shuō)明
這篇文章主要介紹了Python之print函數(shù)里逗號(hào)和加號(hào)的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02