Pytest官方教程-06-使用Marks標(biāo)記測(cè)試用例

目錄:

  1. 安裝及入門
  2. 使用和調(diào)用方法
  3. 原有TestSuite使用方法
  4. 斷言的編寫(xiě)和報(bào)告
  5. Pytest fixtures:清晰 模塊化 易擴(kuò)展
  6. 使用Marks標(biāo)記測(cè)試用例
  7. Monkeypatching/對(duì)模塊和環(huán)境進(jìn)行Mock
  8. 使用tmp目錄和文件
  9. 捕獲stdout及stderr輸出
  10. 捕獲警告信息
  11. 模塊及測(cè)試文件中集成doctest測(cè)試
  12. skip及xfail: 處理不能成功的測(cè)試用例
  13. Fixture方法及測(cè)試用例的參數(shù)化
  14. 緩存: 使用跨執(zhí)行狀態(tài)
  15. unittest.TestCase支持
  16. 運(yùn)行Nose用例
  17. 經(jīng)典xUnit風(fēng)格的setup/teardown
  18. 安裝和使用插件
  19. 插件編寫(xiě)
  20. 編寫(xiě)鉤子(hook)方法
  21. 運(yùn)行日志
  22. API參考
    1. 方法(Functions)
    2. 標(biāo)記(Marks)
    3. 鉤子(Hooks)
    4. 裝置(Fixtures)
    5. 對(duì)象(Objects)
    6. 特殊變量(Special Variables)
    7. 環(huán)境變量(Environment Variables)
    8. 配置選項(xiàng)(Configuration Options)
  23. 優(yōu)質(zhì)集成實(shí)踐
  24. 片狀測(cè)試
  25. Pytest導(dǎo)入機(jī)制及sys.path/PYTHONPATH
  26. 配置選項(xiàng)
  27. 示例及自定義技巧
  28. Bash自動(dòng)補(bǔ)全設(shè)置

使用Marks標(biāo)記測(cè)試用例

通過(guò)使用pytest.mark你可以輕松地在測(cè)試方法上設(shè)置元數(shù)據(jù)肩榕。例如饼疙, 一些常用的內(nèi)置標(biāo)記:

  • skip - 始終跳過(guò)該測(cè)試方法
  • skipif - 遇到特定情況跳過(guò)該測(cè)試方法
  • xfail - 遇到特定情況耘婚,產(chǎn)生一個(gè)“期望失敗”輸出
  • parametrize - 在同一個(gè)測(cè)試方法上運(yùn)行多次調(diào)用

創(chuàng)建自定義標(biāo)記或?qū)?biāo)記應(yīng)用于整個(gè)測(cè)試類或模塊很容易啦吧。 文檔中包含有關(guān)標(biāo)記的示例窑滞,詳情可參閱使用自定義標(biāo)記

注意:
標(biāo)記只對(duì)測(cè)試方法有效验懊,對(duì)fixtures方法無(wú)效卧惜。

在未知標(biāo)記上引發(fā)異常: -strict

當(dāng)使用--strict命令行參數(shù)時(shí),未在pytest.ini文件中注冊(cè)的任何標(biāo)記都將引發(fā)異常忿等。

標(biāo)記可以通過(guò)以下方式注冊(cè):

[pytest]
markers =
    slow
    serial

這可用于防止用戶意外輸錯(cuò)標(biāo)記名稱栖忠。 想要強(qiáng)制執(zhí)行此操作的測(cè)試套件應(yīng)將--strict添加到addopts

[pytest]
addopts = --strict
markers =
    slow
    serial

標(biāo)記改造和迭代

3.6版本新功能
pytest的標(biāo)記傳統(tǒng)地實(shí)現(xiàn)是通過(guò)簡(jiǎn)單地在測(cè)試函數(shù)的__dict__中添加屬性來(lái)進(jìn)行標(biāo)記。結(jié)果贸街,標(biāo)記意外的隨著類的集成而傳遞庵寞。此外,使用@pytest.mark裝飾器應(yīng)用的標(biāo)記和通過(guò)node.add_marker添加的標(biāo)記存儲(chǔ)的位置不同薛匪,用于檢索它們的API也
不一致捐川。

這樣,如果不深入了解測(cè)試代碼內(nèi)部結(jié)構(gòu)逸尖,技術(shù)上幾乎無(wú)法正確使用參數(shù)化數(shù)據(jù)古沥,從而導(dǎo)致在高級(jí)的用法中出現(xiàn)細(xì)微且難以理解的bug品腹。

根據(jù)標(biāo)記聲明/更改的方式致讥,你都可以獲得一個(gè)MarkerInfo對(duì)象,其中也可能會(huì)包含來(lái)自同級(jí)類的標(biāo)記寓免。當(dāng)使用參數(shù)化標(biāo)記苞俘,或node.add_marker時(shí)盹沈,會(huì)丟棄之前的使用裝飾器聲明的MarkDecorators標(biāo)記。MarkerInfo對(duì)象實(shí)際上是使用同一標(biāo)記名的多個(gè)標(biāo)記的合并視圖吃谣,當(dāng)然乞封,MarkerInfo也可以像單個(gè)標(biāo)記一樣使用。

最重要的是基协,即使標(biāo)記是在類/模塊上聲明的歌亲,實(shí)際上菇用,標(biāo)記只能在函數(shù)中訪問(wèn)澜驮。原因是模塊,類和函數(shù)/方法無(wú)法以相同的方式訪問(wèn)標(biāo)記惋鸥。

在pytest 3.6版本中引入了一個(gè)訪問(wèn)標(biāo)記的新API杂穷,以解決初始設(shè)計(jì)中的問(wèn)題悍缠,提供_pytest.nodes.Node.iter_markers()方法以一致的方式迭代標(biāo)記并重新進(jìn)行內(nèi)部處理,這很好地解決了初始設(shè)計(jì)的問(wèn)題耐量。

升級(jí)代碼

不推薦使用原有的Node.get_marker(name)函數(shù)飞蚓,因?yàn)樗祷匾粋€(gè)內(nèi)部MarkerInfo對(duì)象,該對(duì)象包含應(yīng)用于該節(jié)點(diǎn)的所有標(biāo)記的合并名稱和所有參數(shù)廊蜒。

通常趴拧,有兩種方案可以處理標(biāo)記:

  1. 標(biāo)記互相覆蓋。 順序很重要山叮,但你只需要將你的標(biāo)記視為單獨(dú)的標(biāo)記即可著榴。 例如。 對(duì)于測(cè)試方法中的log_level('debug')會(huì)覆蓋模塊級(jí)別的log_level('info')屁倔。

在這種情況下脑又,可以使用Node.get_closest_marker(name)

# 替換這個(gè):
marker = item.get_marker("log_level")
if marker:
    level = marker.args[0]

# 通過(guò)這個(gè):
marker = item.get_closest_marker("log_level")
if marker:
    level = marker.args[0]
  1. 在特定條件下使用標(biāo)記。 例如锐借,skipif(condition)標(biāo)記问麸,意味著你只想測(cè)試所有非condition條件的用例,順序不重要钞翔。你可以將這個(gè)標(biāo)記視為一個(gè)滿足該條件的集合使用严卖。

在這種情況下,迭代每個(gè)標(biāo)記并單獨(dú)處理它們的*args**kwargs參數(shù)嗅战。

# 替換這個(gè):
skipif = item.get_marker("skipif")
if skipif:
    for condition in skipif.args:
        # eval condition
        ...

# 通過(guò)這個(gè):
for skipif in item.iter_markers("skipif"):
    condition = skipif.args[0]
    # eval condition

如果您不確定或遇到任何難題妄田,你可以考慮提出一個(gè)待解決問(wèn)題。

相關(guān)問(wèn)題

以下是新修復(fù)問(wèn)題的詳細(xì)列表:

  • 標(biāo)記不會(huì)選擇嵌套類(#199)驮捍。
  • 標(biāo)記在所有相關(guān)類別上染色(#568)疟呐。
  • 組合標(biāo)記 - args和kwargs計(jì)算(#2897)。
  • request.node.get_marker('name')為類中應(yīng)用的標(biāo)記返回None(#902)东且。
  • 在參數(shù)化中應(yīng)用的標(biāo)記存儲(chǔ)為markdecorator(#2400)启具。
  • 以向后不兼容的方式修復(fù)標(biāo)記交互(#1670)。
  • 重構(gòu)標(biāo)記以擺脫當(dāng)前的“標(biāo)記轉(zhuǎn)移”機(jī)制(#2363)珊泳。
  • 介紹FunctionDefinition節(jié)點(diǎn)鲁冯,在generate_tests中使用它(#2522)。
  • 刪除命名標(biāo)記屬性并收集項(xiàng)目中的標(biāo)記(#891)色查。
  • 來(lái)自參數(shù)化的跳過(guò)標(biāo)記隱藏模塊級(jí)跳過(guò)標(biāo)記(#1540)薯演。
  • skipif + parametrize不跳過(guò)測(cè)試(#1296)。
  • 標(biāo)記轉(zhuǎn)移與繼承不兼容(#535)秧了。

注意:
在未來(lái)的pytest主要版本中跨扮,我們將引入基于類的標(biāo)記,在這些標(biāo)記處,標(biāo)記將不再局限于Mark的實(shí)例衡创。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末帝嗡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子璃氢,更是在濱河造成了極大的恐慌哟玷,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件一也,死亡現(xiàn)場(chǎng)離奇詭異巢寡,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)椰苟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門讼渊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人尊剔,你說(shuō)我怎么就攤上這事爪幻。” “怎么了须误?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵挨稿,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我京痢,道長(zhǎng)奶甘,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任祭椰,我火速辦了婚禮臭家,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘方淤。我一直安慰自己钉赁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布携茂。 她就那樣靜靜地躺著你踩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪讳苦。 梳的紋絲不亂的頭發(fā)上带膜,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音鸳谜,去河邊找鬼膝藕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛咐扭,可吹牛的內(nèi)容都是我干的芭挽。 我是一名探鬼主播懒棉,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼览绿!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起穗慕,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤饿敲,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后逛绵,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體怀各,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年术浪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瓢对。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡胰苏,死狀恐怖硕蛹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情硕并,我是刑警寧澤法焰,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站倔毙,受9級(jí)特大地震影響埃仪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜陕赃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一卵蛉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧么库,春花似錦傻丝、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至允睹,卻和暖如春运准,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缭受。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工胁澳, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人米者。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓韭畸,卻偏偏與公主長(zhǎng)得像宇智,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子胰丁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容