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

python優(yōu)化測(cè)試穩(wěn)定性的失敗重試工具pytest-rerunfailures詳解

 更新時(shí)間:2023年10月20日 09:17:15   作者:郝同學(xué)的測(cè)開(kāi)筆記  
筆者在執(zhí)行自動(dòng)化測(cè)試用例時(shí),會(huì)發(fā)現(xiàn)有時(shí)候用例失敗并非代碼問(wèn)題,而是由于服務(wù)正在發(fā)版,導(dǎo)致請(qǐng)求失敗,從而降低了自動(dòng)化用例的穩(wěn)定性,那該如何增加失敗重試機(jī)制呢?帶著問(wèn)題我們一起探索

前言

筆者在執(zhí)行自動(dòng)化測(cè)試用例時(shí),會(huì)發(fā)現(xiàn)有時(shí)候用例失敗并非代碼問(wèn)題,而是由于服務(wù)正在發(fā)版,導(dǎo)致請(qǐng)求失敗,從而降低了自動(dòng)化用例的穩(wěn)定性,最后還要花時(shí)間定位到底是自身case的原因還是業(yè)務(wù)邏輯問(wèn)題,還是其他原因,增加了定位成本。增加容錯(cuò)機(jī)制,失敗重試,會(huì)解決大部分由于網(wǎng)絡(luò)原因、服務(wù)重啟等原因造成的case失敗問(wèn)題。那該如何增加失敗重試機(jī)制呢?帶著問(wèn)題我們一起探索。

pytest-rerunfailures 插件

先給出答案,我們將使用pytest-rerunfailures插件來(lái)實(shí)現(xiàn)失敗重試功能。

什么是pytest-rerunfailures?

pytest-rerunfailures 是一個(gè)基于 pytest 框架的插件,它允許我們對(duì)測(cè)試用例進(jìn)行失敗重試。當(dāng)一個(gè)測(cè)試用例失敗時(shí),插件會(huì)自動(dòng)重新運(yùn)行失敗的測(cè)試用例,直到達(dá)到預(yù)定的重試次數(shù)或測(cè)試用例通過(guò)為止。這樣可以增加用例的穩(wěn)定性,并減少因?yàn)榕及l(fā)性問(wèn)題導(dǎo)致的測(cè)試失敗。

如何使用pytest-rerunfailures?

方式一

首先,確保已經(jīng)安裝了 pytest-rerunfailures 插件??梢允褂靡韵旅钸M(jìn)行安裝:

pip install pytest-rerunfailures

安裝完成后,在項(xiàng)目中使用 pytest 運(yùn)行測(cè)試用例時(shí),pytest-rerunfailures 插件會(huì)自動(dòng)生效。

接下來(lái),在編寫(xiě)測(cè)試用例時(shí),可以通過(guò)添加 @pytest.mark.flaky 裝飾器將需要重試的測(cè)試用例標(biāo)記起來(lái)。例如:

test_demo.py

import pytest
?
?
@pytest.mark.flaky(reruns=3, reruns_delay=2)
def test_case():
 ? ?assert 1 == 2
?

在上述示例中,我們使用了 @pytest.mark.flaky 裝飾器來(lái)標(biāo)記測(cè)試用例 test_case 為可重試的。參數(shù) reruns 指定了重試次數(shù),而 reruns_delay 則指定了每次重試之間的延遲時(shí)間(以秒為單位)。

我們來(lái)運(yùn)行case,看一下執(zhí)行結(jié)果:

執(zhí)行命令:pytest -s -v test_demo.py::test_case,會(huì)看到如下結(jié)果:

RERUN
test_dir/test_demo.py::test_case RERUN
test_dir/test_demo.py::test_case RERUN
test_dir/test_demo.py::test_case FAILED

可以看到,重試了3次,最終結(jié)果為失敗。

注意:如果你是在pycharm中點(diǎn)擊綠色三角形直接運(yùn)行是不生效的

總結(jié)一下:

當(dāng)運(yùn)行測(cè)試時(shí),如果測(cè)試用例失敗,pytest-rerunfailures 插件會(huì)根據(jù)我們配置的重試次數(shù)和延遲時(shí)間自動(dòng)重新運(yùn)行該測(cè)試用例,直到達(dá)到最大重試次數(shù)或測(cè)試通過(guò)為止。

方式二

除了使用裝飾器來(lái)標(biāo)記測(cè)試用例外,pytest-rerunfailures 還支持使用命令行選項(xiàng)和配置文件的方式進(jìn)行配置。

命令行執(zhí)行的話,可以這樣寫(xiě):

pytest -s -v --reruns 3 --reruns-delay 2 test_demo.py::test_case

或者代碼運(yùn)行的話,可以這樣寫(xiě):

pytest.main(["-s", "-v", "--reruns", "3", "--reruns-delay", "2", "test_demo.py::test_case"])
?

運(yùn)行機(jī)制

到這里,應(yīng)該會(huì)使用了。我們簡(jiǎn)單概括一下它的運(yùn)行機(jī)制:

  • pytest 通過(guò)插件系統(tǒng)加載 pytest-rerunfailures 插件,并啟用其功能。
  • 當(dāng) pytest 運(yùn)行測(cè)試時(shí),對(duì)每個(gè)測(cè)試用例的執(zhí)行進(jìn)行監(jiān)控。
  • 如果一個(gè)測(cè)試用例執(zhí)行失敗,pytest-rerunfailures 插件會(huì)捕獲該失敗,并判斷是否需要進(jìn)行重試。
  • 如果該測(cè)試用例被標(biāo)記為可重試(使用了 @pytest.mark.flaky 裝飾器),插件會(huì)根據(jù)配置的重試次數(shù)和延遲時(shí)間重新運(yùn)行該測(cè)試用例。
  • 在每次重試之前,插件會(huì)根據(jù)設(shè)置的延遲時(shí)間暫停一段時(shí)間。
  • 如果測(cè)試用例在重試次數(shù)達(dá)到上限之前通過(guò)了,即成功執(zhí)行,則插件會(huì)將該測(cè)試用例標(biāo)記為通過(guò)。
  • 如果測(cè)試用例在達(dá)到最大重試次數(shù)后仍然失敗,則插件會(huì)返回最后一次失敗的結(jié)果作為最終的結(jié)果。

總結(jié)起來(lái),pytest-rerunfailures 插件在測(cè)試執(zhí)行失敗時(shí),根據(jù)配置的重試次數(shù)和延遲時(shí)間重新運(yùn)行測(cè)試用例,并根據(jù)重試結(jié)果判斷最終的測(cè)試結(jié)果。這樣可以提高測(cè)試用例的穩(wěn)定性,并減少偶發(fā)性問(wèn)題導(dǎo)致的測(cè)試失敗。

源碼解讀

源碼直達(dá)

使用階段,我們使用mark標(biāo)記,那源碼中應(yīng)該添加了該標(biāo)記

def pytest_configure(config):
 ? ?# add flaky marker
 ? ?config.addinivalue_line(
 ? ? ? ?"markers",
 ? ? ? ?"flaky(reruns=1, reruns_delay=0): mark test to re-run up "
 ? ? ? ?"to 'reruns' times. Add a delay of 'reruns_delay' seconds "
 ? ? ? ?"between re-runs.",
 ?  )
 ? ?......

簡(jiǎn)單解釋一下:

  • pytest_configure(config) 是 pytest 的一個(gè)鉤子函數(shù),用于在 pytest 配置階段對(duì)配置進(jìn)行自定義操作。
  • config.addinivalue_line() 是 pytest 的配置方法,用于向配置中添加新的配置項(xiàng)或配置信息。
  • 在這段代碼中,通過(guò) config.addinivalue_line() 方法,插件向 pytest 的配置中加入了一行字符串。
  • 這行字符串指定了標(biāo)記名稱為 "flaky",并使用參數(shù) rerunsreruns_delay 來(lái)說(shuō)明重試次數(shù)和延遲時(shí)間的默認(rèn)值。
  • 標(biāo)記的含義是將被標(biāo)記的測(cè)試用例重新運(yùn)行最多 "reruns" 次,每次重試之間間隔 "reruns_delay" 秒。

通過(guò)這個(gè)自定義的標(biāo)記,就可以使用 @pytest.mark.flaky 裝飾器來(lái)標(biāo)記需要進(jìn)行重試的測(cè)試用例,并且可以在裝飾器中指定具體的重試次數(shù)和延遲時(shí)間。

我們看看實(shí)現(xiàn)失敗重試的源碼,這才是重點(diǎn)

def pytest_runtest_protocol(item, nextitem):
 ? ?"""
 ?  Run the test protocol.
?
 ?  Note: when teardown fails, two reports are generated for the case, one for
 ?  the test case and the other for the teardown error.
 ?  """
 ? ?reruns = get_reruns_count(item)
 ? ?if reruns is None:
 ? ? ? ?# global setting is not specified, and this test is not marked with
 ? ? ? ?# flaky
 ? ? ? ?return
?
 ? ?# while this doesn't need to be run with every item, it will fail on the
 ? ?# first item if necessary
 ? ?check_options(item.session.config)
 ? ?delay = get_reruns_delay(item)
 ? ?parallel = not is_master(item.config)
 ? ?db = item.session.config.failures_db
 ? ?item.execution_count = db.get_test_failures(item.nodeid)
 ? ?db.set_test_reruns(item.nodeid, reruns)
?
 ? ?if item.execution_count > reruns:
 ? ? ? ?return True
?
 ? ?need_to_run = True
 ? ?while need_to_run:
 ? ? ? ?item.execution_count += 1
 ? ? ? ?item.ihook.pytest_runtest_logstart(nodeid=item.nodeid, location=item.location)
 ? ? ? ?reports = runtestprotocol(item, nextitem=nextitem, log=False)
?
 ? ? ? ?for report in reports: ?# 3 reports: setup, call, teardown
 ? ? ? ? ? ?report.rerun = item.execution_count - 1
 ? ? ? ? ? ?if _should_not_rerun(item, report, reruns):
 ? ? ? ? ? ? ? ?# last run or no failure detected, log normally
 ? ? ? ? ? ? ? ?item.ihook.pytest_runtest_logreport(report=report)
 ? ? ? ? ? ?else:
 ? ? ? ? ? ? ? ?# failure detected and reruns not exhausted, since i < reruns
 ? ? ? ? ? ? ? ?report.outcome = "rerun"
 ? ? ? ? ? ? ? ?time.sleep(delay)
?
 ? ? ? ? ? ? ? ?if not parallel or works_with_current_xdist():
 ? ? ? ? ? ? ? ? ? ?# will rerun test, log intermediate result
 ? ? ? ? ? ? ? ? ? ?item.ihook.pytest_runtest_logreport(report=report)
?
 ? ? ? ? ? ? ? ?# cleanin item's cashed results from any level of setups
 ? ? ? ? ? ? ? ?_remove_cached_results_from_failed_fixtures(item)
 ? ? ? ? ? ? ? ?_remove_failed_setup_state_from_session(item)
?
 ? ? ? ? ? ? ? ?break ?# trigger rerun
 ? ? ? ?else:
 ? ? ? ? ? ?need_to_run = False
?
 ? ? ? ?item.ihook.pytest_runtest_logfinish(nodeid=item.nodeid, location=item.location)
?
 ? ?return True

簡(jiǎn)單解釋一下:

首先,通過(guò)函數(shù) get_reruns_count(item) 獲取當(dāng)前測(cè)試用例需要重試的次數(shù)。如果沒(méi)有設(shè)置重試次數(shù),則直接返回。

然后,檢查配置選項(xiàng)并獲取重試的延遲時(shí)間,并確定是否運(yùn)行在并行模式下。還會(huì)獲取失敗記錄數(shù)據(jù)庫(kù)對(duì)象,并獲取當(dāng)前測(cè)試用例已經(jīng)執(zhí)行的次數(shù)。

接下來(lái),通過(guò)比較已執(zhí)行次數(shù)和設(shè)定的重試次數(shù),判斷是否需要進(jìn)行重試。如果已執(zhí)行次數(shù)大于等于設(shè)定的重試次數(shù),則不再進(jìn)行重試,直接返回。

如果需要重試,會(huì)進(jìn)入一個(gè)循環(huán),每次重試會(huì)增加已執(zhí)行次數(shù)。在重試過(guò)程中,會(huì)調(diào)用 pytest_runtest_logstart 函數(shù)記錄測(cè)試用例開(kāi)始執(zhí)行的日志。

然后,通過(guò)調(diào)用 runtestprotocol 函數(shù)執(zhí)行測(cè)試用例,并獲取測(cè)試結(jié)果。在這里,生成的報(bào)告會(huì)被標(biāo)記為執(zhí)行次數(shù)減一,以便區(qū)分原始執(zhí)行和重試執(zhí)行的報(bào)告。

接著,通過(guò) _should_not_rerun 函數(shù)判斷當(dāng)前報(bào)告是否滿足不需要重試的條件。如果滿足,則繼續(xù)執(zhí)行后續(xù)操作。

如果報(bào)告表明需要重試,并且重試次數(shù)未達(dá)到設(shè)定的次數(shù),會(huì)將報(bào)告的結(jié)果設(shè)置為 "rerun",并根據(jù)設(shè)定的延遲時(shí)間暫停一段時(shí)間。

然后,根據(jù)并行模式和當(dāng)前使用的 xdist 版本,決定是否記錄中間結(jié)果。同時(shí),會(huì)清除緩存的結(jié)果和執(zhí)行狀態(tài)。

之后,重試循環(huán)會(huì)繼續(xù),直到不滿足重試條件為止。最后,會(huì)調(diào)用 pytest_runtest_logfinish 函數(shù)記錄測(cè)試用例結(jié)束執(zhí)行的日志。

最后,函數(shù)返回 True,表示已經(jīng)實(shí)現(xiàn)重試機(jī)制。

總結(jié)起來(lái),這段代碼通過(guò)循環(huán)執(zhí)行測(cè)試用例,并在滿足重試條件時(shí)進(jìn)行重試,直到滿足退出條件為止。在重試過(guò)程中,會(huì)記錄日志、生成報(bào)告,并根據(jù)設(shè)定的重試次數(shù)和延遲時(shí)間進(jìn)行控制。

最后

失敗重試功能并不是解決所有測(cè)試問(wèn)題的法寶,它應(yīng)該被視為一種提高測(cè)試穩(wěn)定性的輔助手段。在使用 pytest-rerunfailures 進(jìn)行失敗重試時(shí),我們應(yīng)該仔細(xì)分析失敗的原因,確保重試次數(shù)和延遲時(shí)間設(shè)置合理,并與團(tuán)隊(duì)成員共同討論和決定是否需要重試測(cè)試用例。

總結(jié)起來(lái),pytest-rerunfailures 是一個(gè)非常有用的工具,可以提高測(cè)試用例的穩(wěn)定性。通過(guò)使用它,我們可以輕松地實(shí)現(xiàn)失敗重試功能,并減少由于偶發(fā)性問(wèn)題導(dǎo)致的測(cè)試失敗。

另外源碼中,看到了pytest_runtest_logstart等,可能有些同學(xué)不明白這是干嘛用的,之后我們專門(mén)寫(xiě)一篇文章來(lái)介紹它的作用。

以上就是python優(yōu)化測(cè)試穩(wěn)定性的失敗重試工具pytest-rerunfailures詳解的詳細(xì)內(nèi)容,更多關(guān)于python工具pytest-rerunfailures的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Pycharm IDE安裝環(huán)境配置的2025最新完整版教程

    Pycharm IDE安裝環(huán)境配置的2025最新完整版教程

    PyCharm是目前最流行、使用最廣泛的Python IDE,帶有一整套可以幫助用戶在使用Python語(yǔ)言開(kāi)發(fā)時(shí)提高其效率的工具,下面我們來(lái)看看Pycharm IDE安裝環(huán)境配置的最新教程吧
    2025-03-03
  • anaconda安裝pytorch1.7.1和torchvision0.8.2的方法(親測(cè)可用)

    anaconda安裝pytorch1.7.1和torchvision0.8.2的方法(親測(cè)可用)

    這篇文章主要介紹了anaconda安裝pytorch1.7.1和torchvision0.8.2的方法(親測(cè)可用),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • python編碼格式導(dǎo)致csv讀取錯(cuò)誤問(wèn)題(csv.reader, pandas.csv_read)

    python編碼格式導(dǎo)致csv讀取錯(cuò)誤問(wèn)題(csv.reader, pandas.csv_read)

    python編碼格式導(dǎo)致csv讀取錯(cuò)誤問(wèn)題(csv.reader, pandas.csv_read),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • python實(shí)現(xiàn)圖片插入文字

    python實(shí)現(xiàn)圖片插入文字

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)圖片插入文字,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • 讓Python程序定時(shí)執(zhí)行的8種方法整理

    讓Python程序定時(shí)執(zhí)行的8種方法整理

    在日常工作中,我們常常會(huì)用到需要周期性執(zhí)行的任務(wù),一種方式是采用?Linux?系統(tǒng)自帶的?crond?結(jié)合命令行實(shí)現(xiàn),另外一種方式是直接使用Python。本文整理了一下?Python?定時(shí)任務(wù)的實(shí)現(xiàn)方式,希望對(duì)大家有所幫助
    2023-01-01
  • Python+redis通過(guò)限流保護(hù)高并發(fā)系統(tǒng)

    Python+redis通過(guò)限流保護(hù)高并發(fā)系統(tǒng)

    這篇文章主要介紹了Python+redis通過(guò)限流保護(hù)高并發(fā)系統(tǒng),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • python面向?qū)ο蟀鎸W(xué)生信息管理系統(tǒng)

    python面向?qū)ο蟀鎸W(xué)生信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了python面向?qū)ο蟀鎸W(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 11行Python代碼實(shí)現(xiàn)解密摩斯密碼

    11行Python代碼實(shí)現(xiàn)解密摩斯密碼

    摩爾斯電碼是一種時(shí)通時(shí)斷的信號(hào)代碼,通過(guò)不同的排列順序來(lái)表達(dá)不同的英文字母、數(shù)字和標(biāo)點(diǎn)符號(hào)。本文將通過(guò)Python代碼來(lái)實(shí)現(xiàn)解密摩斯密碼,感興趣的可以學(xué)習(xí)一下
    2022-04-04
  • Python自定義簡(jiǎn)單圖軸簡(jiǎn)單實(shí)例

    Python自定義簡(jiǎn)單圖軸簡(jiǎn)單實(shí)例

    這篇文章主要介紹了Python自定義簡(jiǎn)單圖軸簡(jiǎn)單實(shí)例,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Java多線程編程中ThreadLocal類的用法及深入

    Java多線程編程中ThreadLocal類的用法及深入

    這篇文章主要介紹了Java多線程編程中ThreadLocal類的用法及深入,嘗試了自己實(shí)現(xiàn)一個(gè)ThreadLocal類以及對(duì)相關(guān)的線程安全問(wèn)題進(jìn)行討論,需要的朋友可以參考下
    2016-06-06

最新評(píng)論