欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

不使用pytest_repeat插件如何實現重復執(zhí)行用例

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

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

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

pytest_repeat如何實現重復執(zhí)行

源碼直達

源碼解讀

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')

這段代碼定義了兩個命令行選項:

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

這兩個選項都是通過 parser.addoption 方法添加到 pytest 的命令行解析器中的。

當運行 pytest 并指定 --count、--repeat-scope 參數時,pytest-repeat 插件將獲取這些參數并自動為測試用例生成多個重復執(zhí)行的實例。

例如,如果運行以下命令:

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

pytest-repeat 將會在執(zhí)行 test_my_function 測試用例時,自動執(zhí)行該測試用例兩次。

action=storeargparse 模塊中的一個參數,它指定了在命令行解析過程中如何處理選項的值。具體地說,action=store 表示將選項的值存儲在命令行參數中。

當使用 parser.addoption 方法添加選項到命令行解析器時,通過指定 action=store,選項的值將被存儲在解析結果中,可以通過相應的屬性來獲取這些值。

例如,當運行 pytest 命令時,指定的 --count--repeat-scope 選項的值會存儲在命令行參數中。你可以使用 request.config.getoption 方法來獲取這些存儲的值,例如:

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
 ? ?# 使用獲取到的值進行后續(xù)操作

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

總結:action=storeargparse 模塊中的一個參數,用于指定將選項的值存儲在命令行參數中。在 pytest 中,通過使用 request.config.getoption 方法可以獲取存儲在命令行參數中的選項值。

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

這個函數在 pytest 的配置階段被調用,通過調用 config.addinivalue_line() 將自定義標記 'repeat(n)' 添加到 pytest 的標記列表中。'repeat(n)' 標記可以用于指定一個測試函數需要重復運行的次數。

@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.")

這個 fixture 函數用于獲取當前的重復運行步驟編號。它首先檢查測試函數是否被 'repeat' 標記裝飾,并從標記中獲取重復次數。如果沒有標記,則使用命令行參數中的 --count 參數作為默認值。

@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
 ? ? ?  )

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

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

可以看到最終是通過參數化來實現的,這也就是為啥重復執(zhí)行多次能當做多條用例。

最后

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

以上就是一文帶你深入理解python中pytest-repeat插件的工作原理的詳細內容,更多關于python pytest-repeat插件的資料請關注腳本之家其它相關文章!

相關文章

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

    史上最詳細的Python打包成exe文件教程

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

    Python實現音頻去廣告和字幕提取

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

    使用python實現哈希表、字典、集合操作

    這篇文章主要介紹了使用python實現哈希表、字典、集合操作,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12
  • python光學仿真面向對象光學元件類的實現

    python光學仿真面向對象光學元件類的實現

    這篇文章主要為大家介紹了python光學仿真面向對象光學元件類的實現示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-10-10
  • 用python生成(動態(tài)彩色)二維碼的方法(使用myqr庫實現)

    用python生成(動態(tài)彩色)二維碼的方法(使用myqr庫實現)

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

    利用Python寫一個爬妹子的爬蟲

    這篇文章主要給大家介紹了關于利用Python寫一個爬妹子爬蟲的相關資料,文中通過實例代碼將實現的方法一步步介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-06-06
  • Python運行中頻繁出現Restart提示的解決辦法

    Python運行中頻繁出現Restart提示的解決辦法

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

    python實現兩個文件合并功能

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

    linux mint中搜狗輸入法導致pycharm卡死的問題

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

    淺析python打包工具distutils、setuptools

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

最新評論