最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入了解Python中Pytest Markers的使用方法

 更新時(shí)間:2023年09月05日 09:06:56   作者:郝同學(xué)的測(cè)開(kāi)筆記  
從這篇開(kāi)始,逐一解決fixture是啥,mark是啥,參數(shù)request是啥,鉤子函數(shù)是啥,parametrize參數(shù)化是啥,這些問(wèn)題,本片先介紹一下mark是啥,以及如何使用

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è)方法??梢栽跍y(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í)行:滿(mǎn)足條件就跳過(guò),不滿(mǎn)足條件就不跳過(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è)條件不滿(mǎn)足,我電腦的版本為3.8,第二個(gè)條件滿(mǎn)足,最終case跳過(guò)。

注意:當(dāng)一個(gè)用例指定了多個(gè)skipif條件時(shí),只需滿(mǎn)足其中一個(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)行p0pytest -v -m 'p0' test_demo.py

運(yùn)行p0/p1pytest -v -m 'p0 and p1' test_demo.py

執(zhí)行后,會(huì)發(fā)現(xiàn)有警告信息PytestUnknownMarkWarning,你可以忽略。想要解決的話(huà),也可以在配置文件中配置自定義的標(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中最常用的10個(gè)內(nèi)置函數(shù)

    詳解Python中最常用的10個(gè)內(nèi)置函數(shù)

    Python作為一種多用途編程語(yǔ)言,擁有豐富的內(nèi)置函數(shù)庫(kù),這些函數(shù)可以極大地提高開(kāi)發(fā)效率,本文將介紹Python中最常用的10個(gè)內(nèi)置函數(shù),我們將深入了解每個(gè)函數(shù),并提供示例代碼以幫助您更好地理解它們,需要的朋友可以參考下
    2023-11-11
  • 對(duì)python中UDP,socket的使用詳解

    對(duì)python中UDP,socket的使用詳解

    今天小編就為大家分享一篇對(duì)python中UDP,socket的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08
  • java中兩個(gè)byte數(shù)組實(shí)現(xiàn)合并的示例

    java中兩個(gè)byte數(shù)組實(shí)現(xiàn)合并的示例

    今天小編就為大家分享一篇java中兩個(gè)byte數(shù)組實(shí)現(xiàn)合并的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • Python實(shí)現(xiàn)任意文件查找工具的不同方法詳解

    Python實(shí)現(xiàn)任意文件查找工具的不同方法詳解

    在日常的開(kāi)發(fā)和運(yùn)維工作中,經(jīng)常需要查找特定類(lèi)型的文件或帶有特定模式的文件,本文將提供兩種不同的編寫(xiě)文件查找工具實(shí)現(xiàn)方式,需要的可以參考下
    2025-03-03
  • Python使用cProfile分析和定位應(yīng)用性能瓶頸點(diǎn)

    Python使用cProfile分析和定位應(yīng)用性能瓶頸點(diǎn)

    cProfile?是?Python?標(biāo)準(zhǔn)庫(kù)中的一個(gè)模塊,用于對(duì)?Python?程序進(jìn)行性能分析,它能輸出每個(gè)函數(shù)的調(diào)用次數(shù)、執(zhí)行耗時(shí)等詳細(xì)信息,下面我們來(lái)看看如何使用cProfile分析和定位應(yīng)用性能瓶頸點(diǎn)吧
    2024-12-12
  • Python數(shù)據(jù)預(yù)處理時(shí)缺失值的不同處理方式總結(jié)

    Python數(shù)據(jù)預(yù)處理時(shí)缺失值的不同處理方式總結(jié)

    在使用python做數(shù)據(jù)分析的時(shí)候,經(jīng)常需要先對(duì)數(shù)據(jù)做統(tǒng)一化的處理,缺失值的處理是經(jīng)常會(huì)使用到的。今天介紹的是使用差補(bǔ)法/均值/固定值等不同的方式完成數(shù)據(jù)填充從而保證數(shù)據(jù)的完整性,感興趣的可以了解一下
    2022-12-12
  • Python使用Selenium實(shí)現(xiàn)淘寶搶單的流程分析

    Python使用Selenium實(shí)現(xiàn)淘寶搶單的流程分析

    這篇文章主要介紹了Python使用Selenium實(shí)現(xiàn)淘寶搶單的流程分析,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Python使用gTTS實(shí)現(xiàn)文本轉(zhuǎn)語(yǔ)音的終極指南

    Python使用gTTS實(shí)現(xiàn)文本轉(zhuǎn)語(yǔ)音的終極指南

    gTTS是一款基于Google翻譯API的Python文本轉(zhuǎn)語(yǔ)音庫(kù),支持100+種語(yǔ)言,只需幾行代碼即可生成MP3語(yǔ)音文件,下面我們就來(lái)看看它的具體應(yīng)用吧
    2026-05-05
  • Python中%r和%s的詳解及區(qū)別

    Python中%r和%s的詳解及區(qū)別

    這篇文章主要介紹了Python中%r和%s的詳解及區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • python多線(xiàn)程下信號(hào)處理程序示例

    python多線(xiàn)程下信號(hào)處理程序示例

    這篇文章主要為大家詳細(xì)介紹了python多線(xiàn)程下信號(hào)處理程序示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05

最新評(píng)論

龙岩市| 海原县| 馆陶县| 安西县| 陆丰市| 仁布县| 金湖县| 隆尧县| 昭平县| 康马县| 陇川县| 法库县| 博野县| 阜城县| 长阳| 保德县| 平原县| 珠海市| 封开县| 璧山县| 宜昌市| 新郑市| 洛阳市| 苏尼特右旗| 武安市| 镇安县| 巫溪县| 定远县| 玛纳斯县| 迁西县| 江门市| 土默特右旗| 闻喜县| 夹江县| 广丰县| 阿拉善盟| 宁蒗| 天全县| 高平市| 黄冈市| 云林县|