亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

一文帶你深入理解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、class、modulesession。默認(rèn)值是 functionaction=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)文章

  • 史上最詳細(xì)的Python打包成exe文件教程

    史上最詳細(xì)的Python打包成exe文件教程

    這篇文章主要給大家介紹了關(guān)于Python打包成exe文件的相關(guān)資料,堪稱史上最詳細(xì)的教程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Python實(shí)現(xiàn)音頻去廣告和字幕提取

    Python實(shí)現(xiàn)音頻去廣告和字幕提取

    這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)音頻去廣告和字幕提取功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-02-02
  • 使用python實(shí)現(xiàn)哈希表、字典、集合操作

    使用python實(shí)現(xiàn)哈希表、字典、集合操作

    這篇文章主要介紹了使用python實(shí)現(xiàn)哈希表、字典、集合操作,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12
  • python光學(xué)仿真面向?qū)ο蠊鈱W(xué)元件類的實(shí)現(xiàn)

    python光學(xué)仿真面向?qū)ο蠊鈱W(xué)元件類的實(shí)現(xiàn)

    這篇文章主要為大家介紹了python光學(xué)仿真面向?qū)ο蠊鈱W(xué)元件類的實(shí)現(xiàn)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-10-10
  • 用python生成(動(dòng)態(tài)彩色)二維碼的方法(使用myqr庫(kù)實(shí)現(xiàn))

    用python生成(動(dòng)態(tài)彩色)二維碼的方法(使用myqr庫(kù)實(shí)現(xiàn))

    今天小編就為大家分享一篇用python生成(動(dòng)態(tài)彩色)二維碼的方法(使用myqr庫(kù)實(shí)現(xiàn)),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-06-06
  • 利用Python寫一個(gè)爬妹子的爬蟲

    利用Python寫一個(gè)爬妹子的爬蟲

    這篇文章主要給大家介紹了關(guān)于利用Python寫一個(gè)爬妹子爬蟲的相關(guān)資料,文中通過(guò)實(shí)例代碼將實(shí)現(xiàn)的方法一步步介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-06-06
  • Python運(yùn)行中頻繁出現(xiàn)Restart提示的解決辦法

    Python運(yùn)行中頻繁出現(xiàn)Restart提示的解決辦法

    在編程的世界里,遇到各種奇怪的問(wèn)題是家常便飯,但是,當(dāng)你的 Python 程序在運(yùn)行過(guò)程中頻繁出現(xiàn)“Restart”提示時(shí),這可能不僅僅是令人頭疼的小問(wèn)題,而是隱藏著深層次的原因,本文將深入探討這一現(xiàn)象,并提供解決方案,需要的朋友可以參考下
    2025-04-04
  • python實(shí)現(xiàn)兩個(gè)文件合并功能

    python實(shí)現(xiàn)兩個(gè)文件合并功能

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)兩個(gè)文件合并功能,一個(gè)簡(jiǎn)單的文件合并程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • linux mint中搜狗輸入法導(dǎo)致pycharm卡死的問(wèn)題

    linux mint中搜狗輸入法導(dǎo)致pycharm卡死的問(wèn)題

    這篇文章主要介紹了linux mint中搜狗輸入法導(dǎo)致pycharm卡死的問(wèn)題,這篇文章給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 淺析python打包工具distutils、setuptools

    淺析python打包工具distutils、setuptools

    python包在開(kāi)發(fā)中十分常見(jiàn),一般的使用套路是所有的功能做一個(gè)python模塊包,打包模塊,然后發(fā)布,安裝使用。這篇文章給大家介紹了python打包工具distutils、setuptools的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2018-04-04

最新評(píng)論