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

一文帶你深入理解python中pytest-repeat插件的工作原理

 更新時(shí)間:2023年09月02日 08:57:23   作者:郝同學(xué)的測(cè)開(kāi)筆記  
這篇文章主要和大家一起深入探討到底pytest_repeat插件的具體功能是如何實(shí)現(xiàn)的呢,相信具體了解了該插件,其他三方插件也可以很快了解它內(nèi)部運(yùn)行機(jī)制,所以本文詳細(xì)講解了python pytest-repeat插件的工作原理,需要的朋友可以參考下

不使用pytest_repeat插件如何實(shí)現(xiàn)重復(fù)執(zhí)行用例

最笨的辦法,當(dāng)然是運(yùn)行多次,但這顯然不是我們需要的,我們知道裝飾器可以在不修改原始代碼的情況下,動(dòng)態(tài)的增加功能或修改函數(shù)行為。顯然,這里我們就可以使用裝飾器來(lái)實(shí)現(xiàn)重復(fù)功能。

def repeat(nums: int = 2):
 ? ?def wrapper(func):
?
 ? ? ? ?@functools.wraps(func)
 ? ? ? ?def decorator(*args, **kwargs):
 ? ? ? ? ? ?for i in range(nums):
 ? ? ? ? ? ? ? ?func(*args, **kwargs)
?
 ? ? ? ?return decorator
?
 ? ?return wrapper

這段代碼很好理解,定義了帶有自定義參數(shù)的裝飾器,表示裝飾器內(nèi)部函數(shù)執(zhí)行的次數(shù)。這樣在用例上使用@repeat()裝飾器就可以達(dá)到用例重復(fù)運(yùn)行的目的。但是統(tǒng)計(jì)結(jié)果仍然為1條用例。使用過(guò)pytest_repeat的同學(xué)知道它的統(tǒng)計(jì)結(jié)果是多條用例?那是如何做的呢,通過(guò)源碼一探究竟。

pytest_repeat如何實(shí)現(xiàn)重復(fù)執(zhí)行

源碼直達(dá)

源碼解讀

def pytest_addoption(parser):
 ? ?parser.addoption(
 ? ? ? ?'--count',
 ? ? ? ?action='/pytest-dev/pytest-repeat/blob/v0.9.1/store',
 ? ? ? ?default=1,
 ? ? ? ?type=int,
 ? ? ? ?help='Number of times to repeat each test')
?
 ? ?parser.addoption(
 ? ? ? ?'--repeat-scope',
 ? ? ? ?action='/pytest-dev/pytest-repeat/blob/v0.9.1/store',
 ? ? ? ?default='function',
 ? ? ? ?type=str,
 ? ? ? ?choices=('function', 'class', 'module', 'session'),
 ? ? ? ?help='Scope for repeating tests')

這段代碼定義了兩個(gè)命令行選項(xiàng):

  • --count:用于指定每個(gè)測(cè)試用例要重復(fù)執(zhí)行的次數(shù)。action=store 表示將值存儲(chǔ)在命令行參數(shù)中。
  • --repeat-scope:用于指定重復(fù)測(cè)試用例的作用域,可以選擇 function、classmodulesession。默認(rèn)值是 function。action=store 表示將值存儲(chǔ)在命令行參數(shù)中。

這兩個(gè)選項(xiàng)都是通過(guò) parser.addoption 方法添加到 pytest 的命令行解析器中的。

當(dāng)運(yùn)行 pytest 并指定 --count、--repeat-scope 參數(shù)時(shí),pytest-repeat 插件將獲取這些參數(shù)并自動(dòng)為測(cè)試用例生成多個(gè)重復(fù)執(zhí)行的實(shí)例。

例如,如果運(yùn)行以下命令:

pytest --count=2 --repeat-scope=function

pytest-repeat 將會(huì)在執(zhí)行 test_my_function 測(cè)試用例時(shí),自動(dòng)執(zhí)行該測(cè)試用例兩次。

action=storeargparse 模塊中的一個(gè)參數(shù),它指定了在命令行解析過(guò)程中如何處理選項(xiàng)的值。具體地說(shuō),action=store 表示將選項(xiàng)的值存儲(chǔ)在命令行參數(shù)中。

當(dāng)使用 parser.addoption 方法添加選項(xiàng)到命令行解析器時(shí),通過(guò)指定 action=store,選項(xiàng)的值將被存儲(chǔ)在解析結(jié)果中,可以通過(guò)相應(yīng)的屬性來(lái)獲取這些值。

例如,當(dāng)運(yùn)行 pytest 命令時(shí),指定的 --count--repeat-scope 選項(xiàng)的值會(huì)存儲(chǔ)在命令行參數(shù)中。你可以使用 request.config.getoption 方法來(lái)獲取這些存儲(chǔ)的值,例如:

def test_example(request):
 ? ?count = request.config.getoption('--count') 
 ? ?# count = request.config.option.count 這樣也能獲取
 ? ?repeat_scope = request.config.getoption('--repeat-scope')
 ? ?# repeat_scope = request.config.option.repeat_scope
 ? ?# 使用獲取到的值進(jìn)行后續(xù)操作

在上面的示例代碼中,使用 request.config.getoption 方法從命令行參數(shù)中獲取了 --count--repeat-scope 的值,并分別存儲(chǔ)在 countrepeat_scope 變量中。

總結(jié):action=storeargparse 模塊中的一個(gè)參數(shù),用于指定將選項(xiàng)的值存儲(chǔ)在命令行參數(shù)中。在 pytest 中,通過(guò)使用 request.config.getoption 方法可以獲取存儲(chǔ)在命令行參數(shù)中的選項(xiàng)值。

def pytest_configure(config):
 ? ?config.addinivalue_line(
 ? ? ? ?'markers',
 ? ? ? ?'repeat(n): run the given test function `n` times.')

這個(gè)函數(shù)在 pytest 的配置階段被調(diào)用,通過(guò)調(diào)用 config.addinivalue_line() 將自定義標(biāo)記 'repeat(n)' 添加到 pytest 的標(biāo)記列表中。'repeat(n)' 標(biāo)記可以用于指定一個(gè)測(cè)試函數(shù)需要重復(fù)運(yùn)行的次數(shù)。

@pytest.fixture
def __pytest_repeat_step_number(request):
 ? ?marker = request.node.get_closest_marker("repeat")
 ? ?count = marker and marker.args[0] or request.config.option.count
 ? ?if count > 1:
 ? ? ? ?try:
 ? ? ? ? ? ?return request.param
 ? ? ? ?except AttributeError:
 ? ? ? ? ? ?if issubclass(request.cls, TestCase):
 ? ? ? ? ? ? ? ?warnings.warn(
 ? ? ? ? ? ? ? ? ? ?"Repeating unittest class tests not supported")
 ? ? ? ? ? ?else:
 ? ? ? ? ? ? ? ?raise UnexpectedError(
 ? ? ? ? ? ? ? ? ? ?"This call couldn't work with pytest-repeat. "
 ? ? ? ? ? ? ? ? ? ?"Please consider raising an issue with your usage.")

這個(gè) fixture 函數(shù)用于獲取當(dāng)前的重復(fù)運(yùn)行步驟編號(hào)。它首先檢查測(cè)試函數(shù)是否被 'repeat' 標(biāo)記裝飾,并從標(biāo)記中獲取重復(fù)次數(shù)。如果沒(méi)有標(biāo)記,則使用命令行參數(shù)中的 --count 參數(shù)作為默認(rèn)值。

@pytest.hookimpl(trylast=True)
def pytest_generate_tests(metafunc):
 ? ?count = metafunc.config.option.count
 ? ?m = metafunc.definition.get_closest_marker('repeat')
 ? ?if m is not None:
 ? ? ? ?count = int(m.args[0])
 ? ?if count > 1:
 ? ? ? ?metafunc.fixturenames.append("__pytest_repeat_step_number")
?
 ? ? ? ?def make_progress_id(i, n=count):
 ? ? ? ? ? ?return '{0}-{1}'.format(i + 1, n)
?
 ? ? ? ?scope = metafunc.config.option.repeat_scope
 ? ? ? ?metafunc.parametrize(
 ? ? ? ? ? ?'__pytest_repeat_step_number',
 ? ? ? ? ? ?range(count),
 ? ? ? ? ? ?indirect=True,
 ? ? ? ? ? ?ids=make_progress_id,
 ? ? ? ? ? ?scope=scope
 ? ? ?  )

這個(gè) pytest_generate_tests 鉤子函數(shù)會(huì)在 pytest 收集到所有測(cè)試函數(shù)之后被調(diào)用,并且它被設(shè)置為 trylast=True,以確保在其他鉤子函數(shù)執(zhí)行完畢之后再執(zhí)行。

  • 首先,代碼獲取了 metafunc.config.option.count 的值,該值表示測(cè)試用例重復(fù)執(zhí)行的次數(shù)。
  • 然后,代碼調(diào)用 metafunc.definition.get_closest_marker('repeat') 來(lái)獲取測(cè)試用例是否有被標(biāo)記為 repeat 的 marker。
  • 如果有 repeat 的 marker 標(biāo)記,則從 marker 中獲取重復(fù)執(zhí)行的次數(shù),并將其賦值給 count 變量。
  • 接下來(lái),代碼通過(guò) metafunc.fixturenames.append("__pytest_repeat_step_number") 添加了一個(gè)名為 __pytest_repeat_step_number 的 fixture 名稱到 metafunc 的 fixture 列表中。
  • 之后,定義了一個(gè)輔助函數(shù) make_progress_id,用于生成測(cè)試用例的進(jìn)度標(biāo)識(shí)符。
  • 根據(jù) metafunc.config.option.repeat_scope 的值,確定了重復(fù)執(zhí)行的作用域。
  • 最后,通過(guò)調(diào)用 metafunc.parametrize 來(lái)動(dòng)態(tài)生成測(cè)試用例。它使用了 range(count) 來(lái)生成重復(fù)執(zhí)行的步驟數(shù)量作為參數(shù),并將 indirect=True 設(shè)置為在加載 fixture 時(shí)進(jìn)行間接調(diào)用。同時(shí),使用了之前定義的進(jìn)度標(biāo)識(shí)符生成函數(shù)和作用域來(lái)設(shè)置參數(shù)化的其他選項(xiàng)。

可以看到最終是通過(guò)參數(shù)化來(lái)實(shí)現(xiàn)的,這也就是為啥重復(fù)執(zhí)行多次能當(dāng)做多條用例。

最后

相信你看我之后依然有很多疑問(wèn),fixture是啥?mark是啥?參數(shù)request是啥?鉤子函數(shù)是啥?parametrize參數(shù)化是啥?這些疑問(wèn)可以先留著,這片內(nèi)容我們主要講了pytest_repeat具體實(shí)現(xiàn)邏輯,然后引出了這么多知識(shí)點(diǎn),別著急,之后會(huì)一個(gè)個(gè)逐一消滅。

以上就是一文帶你深入理解python中pytest-repeat插件的工作原理的詳細(xì)內(nèi)容,更多關(guān)于python pytest-repeat插件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python 實(shí)例進(jìn)階之預(yù)測(cè)房?jī)r(jià)走勢(shì)

    Python 實(shí)例進(jìn)階之預(yù)測(cè)房?jī)r(jià)走勢(shì)

    買房應(yīng)該是大多數(shù)都會(huì)要面臨的一個(gè)選擇,當(dāng)前經(jīng)濟(jì)和政策背景下,未來(lái)房?jī)r(jià)會(huì)漲還是跌?這是很多人都關(guān)心的一個(gè)話題。今天分享的這篇文章,以波士頓的房地產(chǎn)市場(chǎng)為例,根據(jù)低收入人群比例、老師學(xué)生數(shù)量等特征,利用 Python 進(jìn)行了預(yù)測(cè),給大家做一個(gè)參考
    2021-11-11
  • Pytest之測(cè)試命名規(guī)則的使用

    Pytest之測(cè)試命名規(guī)則的使用

    這篇文章主要介紹了Pytest之測(cè)試命名規(guī)則的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 在Python中操作字典之clear()方法的使用

    在Python中操作字典之clear()方法的使用

    這篇文章主要介紹了在Python中操作字典之clear()方法的使用,是Python入門(mén)的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-05-05
  • Python os模塊學(xué)習(xí)筆記

    Python os模塊學(xué)習(xí)筆記

    這篇文章主要介紹了Python os模塊學(xué)習(xí)筆記,本文總結(jié)了OS模塊的常用方法、實(shí)用方法,并給出了兩個(gè)使用實(shí)例,需要的朋友可以參考下
    2015-06-06
  • Win10搭建Pyspark2.4.4+Pycharm開(kāi)發(fā)環(huán)境的圖文教程(親測(cè))

    Win10搭建Pyspark2.4.4+Pycharm開(kāi)發(fā)環(huán)境的圖文教程(親測(cè))

    本文主要介紹了Win10搭建Pyspark2.4.4+Pycharm開(kāi)發(fā)環(huán)境的圖文教程(親測(cè)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Python線程問(wèn)題與解決方案

    Python線程問(wèn)題與解決方案

    在 Python 中,線程的使用可以有效提高程序的并發(fā)性和響應(yīng)能力,尤其是在 I/O 密集型任務(wù)(如文件讀寫(xiě)、網(wǎng)絡(luò)請(qǐng)求)中,然而,線程在 Python 中也會(huì)引發(fā)一些常見(jiàn)問(wèn)題,下面介紹 Python 線程問(wèn)題的解決方案,需要的朋友可以參考下
    2024-09-09
  • Python使用Reflex構(gòu)建現(xiàn)代Web應(yīng)用的完全指南

    Python使用Reflex構(gòu)建現(xiàn)代Web應(yīng)用的完全指南

    這篇文章為大家深入介紹了Reflex框架的設(shè)計(jì)理念,技術(shù)特性,項(xiàng)目結(jié)構(gòu),核心 API,實(shí)際開(kāi)發(fā)流程以及與其他框架的對(duì)比和部署建議,感興趣的小伙伴可以了解下
    2025-05-05
  • python的virtualenv虛擬環(huán)境常見(jiàn)問(wèn)題和命令

    python的virtualenv虛擬環(huán)境常見(jiàn)問(wèn)題和命令

    在Python中,venv是一個(gè)用于創(chuàng)建和管理虛擬環(huán)境的模塊,虛擬環(huán)境可以幫助你在項(xiàng)目之間隔離不同的Python包和依賴關(guān)系,這篇文章主要介紹了python的virtualenv虛擬環(huán)境常見(jiàn)問(wèn)題和命令,需要的朋友可以參考下
    2024-07-07
  • 如何在Conda環(huán)境中降級(jí)Python版本詳細(xì)指南

    如何在Conda環(huán)境中降級(jí)Python版本詳細(xì)指南

    在Conda環(huán)境中查看Python版本是一個(gè)常見(jiàn)需求,特別是當(dāng)您管理多個(gè)環(huán)境時(shí),這篇文章主要介紹了如何在Conda環(huán)境中降級(jí)Python版本的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-11-11
  • Python 的 f-string 可以連接字符串與數(shù)字的原因解析

    Python 的 f-string 可以連接字符串與數(shù)字的原因解析

    這篇文章主要介紹了Python 的 f-string 可以連接字符串與數(shù)字的原因解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02

最新評(píng)論

江达县| 潜山县| 绥棱县| 土默特左旗| 车致| 临颍县| 绥芬河市| 尉犁县| 广东省| 巴马| 台南县| 龙川县| 青龙| 永福县| 中西区| 梁山县| 桦南县| 隆林| 井陉县| 横峰县| 永川市| 安顺市| 武威市| 普定县| 建瓯市| 青海省| 左贡县| 资溪县| 含山县| 乌拉特前旗| 峨山| 宜丰县| 措勤县| 青神县| 襄垣县| 广饶县| 华坪县| 辽宁省| 团风县| 合阳县| 台前县|