Pytest失敗重跑機(jī)制pytest-rerunfailures的實(shí)現(xiàn)
在自動(dòng)化測(cè)試中,偶發(fā)性失敗是常見(jiàn)痛點(diǎn)。本文將深入解析如何通過(guò)pytest-rerunfailures插件優(yōu)雅解決偶發(fā)故障問(wèn)題。
一、核心命令解析
安裝命令
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pytest-rerunfailures
-i:指定鏡像源(國(guó)內(nèi)加速)pypi.tuna.tsinghua.edu.cn:清華大學(xué)PyPI鏡像pytest-rerunfailures:失敗重跑插件
基礎(chǔ)重跑命令
pytest -s testcases/test_rerun.py --reruns 5
--reruns 5:最大重試次數(shù)(失敗后自動(dòng)重跑最多5次)
延遲重跑命令
pytest -s testcases/test_rerun.py --reruns 5 --reruns-delay 1
--reruns-delay 1:每次重試間隔1秒
二、為什么需要失敗重跑?
偶發(fā)性失敗的常見(jiàn)原因
| 失敗類(lèi)型 | 占比 | 典型場(chǎng)景 |
|---|---|---|
| 環(huán)境波動(dòng) | 40% | 網(wǎng)絡(luò)抖動(dòng)、資源競(jìng)爭(zhēng) |
| 時(shí)序問(wèn)題 | 30% | 異步操作未完成 |
| 第三方依賴(lài) | 20% | API限流、服務(wù)不穩(wěn)定 |
| 隨機(jī)因素 | 10% | 隨機(jī)數(shù)據(jù)沖突 |
重跑機(jī)制的價(jià)值
graph LR
A[首次失敗] --> B{是否可重跑?}
B -->|是| C[自動(dòng)重試]
B -->|否| D[標(biāo)記失敗]
C --> E{重試成功?}
E -->|是| F[報(bào)告成功]
E -->|否| D
三、實(shí)戰(zhàn)演示:重跑機(jī)制應(yīng)用
測(cè)試場(chǎng)景:支付結(jié)果查詢(xún)
# test_payment.py
import pytest
import random
def test_payment_status():
""" 模擬第三方支付接口的不穩(wěn)定響應(yīng) """
result = random.choice([True, False]) # 50%失敗率
assert result, "支付狀態(tài)查詢(xún)失敗"
執(zhí)行結(jié)果對(duì)比
無(wú)重跑機(jī)制
$ pytest test_payment.py ============================ 1 failed in 0.12s
啟用重跑機(jī)制
$ pytest test_payment.py --reruns 3 --reruns-delay 0.5 ============================ rerun test_payment.py::test_payment_status Rerun #1: 失敗 Rerun #2: 成功 1 passed, 2 rerun in 0.87s
四、進(jìn)階使用技巧
1. 標(biāo)記特定測(cè)試重跑
@pytest.mark.flaky(reruns=3, reruns_delay=1)
def test_api_connection():
response = requests.get("https://unstable-api.com")
assert response.status_code == 200
優(yōu)勢(shì):針對(duì)不穩(wěn)定API單獨(dú)設(shè)置重試策略
2. 條件重跑(僅重試特定異常)
@pytest.mark.flaky(
reruns=3,
condition=TypeError # 僅當(dāng)捕獲TypeError時(shí)重試
)
def test_data_processing():
# 可能因數(shù)據(jù)類(lèi)型錯(cuò)誤失敗
process_data(get_external_data())
3. 重跑結(jié)果報(bào)告增強(qiáng)
pytest --reruns 2 --reruns-delay 1 --html=report.html
報(bào)告效果:
測(cè)試用例 狀態(tài) 重試次數(shù)
test_login PASSED 0
test_payment PASSED 2 (首次失敗)
五、重跑機(jī)制原理剖析
執(zhí)行流程
1. pytest收集測(cè)試用例
2. 執(zhí)行原始測(cè)試
- 成功 → 記錄結(jié)果
- 失敗 → 觸發(fā)重試機(jī)制
3. 重試執(zhí)行(最多N次)
- 任意成功 → 標(biāo)記為passed
- 全部失敗 → 標(biāo)記為failed
4. 生成最終報(bào)告
注意事項(xiàng)
- setup/teardown:每次重試都會(huì)重新執(zhí)行
- 測(cè)試狀態(tài):只有最終狀態(tài)計(jì)入報(bào)告
- 耗時(shí)計(jì)算:包含所有重試時(shí)間總和
六、最佳實(shí)踐指南
1. 重試策略配置建議
| 場(chǎng)景類(lèi)型 | reruns | reruns-delay | 說(shuō)明 |
|---|---|---|---|
| 網(wǎng)絡(luò)依賴(lài) | 3-5 | 1-3s | 等待網(wǎng)絡(luò)恢復(fù) |
| 異步操作 | 2-3 | 0.5-1s | 給操作完成時(shí)間 |
| 高負(fù)載服務(wù) | 5+ | 隨機(jī)延遲 | 避免雪崩效應(yīng) |
| 數(shù)據(jù)庫(kù)競(jìng)爭(zhēng) | 3 | 0.3s | 減少鎖沖突 |
2. 避免濫用重跑
不應(yīng)使用重跑的場(chǎng)景:
- 邏輯性錯(cuò)誤(永遠(yuǎn)失?。?/li>
- 環(huán)境配置錯(cuò)誤
- 數(shù)據(jù)一致性問(wèn)題
- 性能不達(dá)標(biāo)場(chǎng)景
3. 結(jié)合其他機(jī)制
# 重跑+分布式執(zhí)行 pytest -n auto --reruns 3 # 重跑+失敗截圖 pytest --reruns 2 --screenshot-on-failure # 重跑+性能監(jiān)控 pytest --reruns 1 --perf-monitor
七、企業(yè)級(jí)應(yīng)用案例
案例1:電商支付系統(tǒng)測(cè)試
挑戰(zhàn):支付網(wǎng)關(guān)接口偶發(fā)超時(shí)(發(fā)生率約5%)
解決方案:
pytest tests/payment/ --reruns 3 --reruns-delay 2
效果:
- 測(cè)試穩(wěn)定性從95%提升至99.9%
- 誤報(bào)缺陷減少90%
- 團(tuán)隊(duì)信任度顯著提升
案例2:微服務(wù)集成測(cè)試
問(wèn)題:服務(wù)啟動(dòng)順序?qū)е屡及l(fā)失敗
重跑策略:
@pytest.mark.flaky(
reruns=2,
reruns_delay=5, # 等待服務(wù)注冊(cè)完成
condition=ConnectionError
)
def test_service_integration():
# 測(cè)試服務(wù)間調(diào)用
案例3:移動(dòng)App自動(dòng)化測(cè)試
特殊需求:
- 首次安裝權(quán)限彈窗干擾
- 應(yīng)用啟動(dòng)時(shí)間波動(dòng)
定制方案:
pytest mobile_tests/ --reruns 1 --reruns-delay 10
首次失敗后等待10秒重試,避開(kāi)初始化階段
八、常見(jiàn)問(wèn)題解決方案
Q1:重跑導(dǎo)致測(cè)試時(shí)間過(guò)長(zhǎng)
解決方案:
# 只對(duì)標(biāo)記為flaky的測(cè)試重跑 pytest -m flaky --reruns 3 # 使用智能延遲(指數(shù)退避) @pytest.mark.flaky(reruns=3, reruns_delay="exponential")
Q2:如何區(qū)分重跑日志?
# conftest.py
def pytest_runtest_logstart(nodeid, location):
if hasattr(request.node, "execution_count"):
count = request.node.execution_count
print(f"\n[重試 #{count}] {nodeid}")
Q3:重跑后如何清理狀態(tài)?
@pytest.fixture(autouse=True)
def cleanup_after_retry(request):
yield
if hasattr(request.node, "execution_count"):
# 每次重試后清理
reset_test_state()
九、重跑機(jī)制核心價(jià)值
核心優(yōu)勢(shì)矩陣
| 維度 | 傳統(tǒng)模式 | 重跑機(jī)制 |
|---|---|---|
| 穩(wěn)定性 | 偶發(fā)失敗導(dǎo)致誤報(bào) | 過(guò)濾偶發(fā)故障 |
| 可信度 | 報(bào)告可信度低 | 真實(shí)反映質(zhì)量 |
| 維護(hù)成本 | 大量時(shí)間排查偽缺陷 | 聚焦真實(shí)問(wèn)題 |
| 執(zhí)行效率 | 手動(dòng)重跑浪費(fèi)時(shí)間 | 自動(dòng)恢復(fù)執(zhí)行 |
最佳實(shí)踐口訣
偶發(fā)失敗不用慌,rerun插件來(lái)幫忙 --reruns 設(shè)次數(shù),--delay 定間隔 標(biāo)記注解更精準(zhǔn),避免濫用記心上 結(jié)合報(bào)告分布式,測(cè)試穩(wěn)定又高效
通過(guò)合理應(yīng)用pytest-rerunfailures,您可以將自動(dòng)化測(cè)試的穩(wěn)定性提升到新的高度。記?。?strong>重跑是應(yīng)對(duì)偶發(fā)故障的利器,但不是代碼質(zhì)量問(wèn)題的遮羞布。當(dāng)測(cè)試頻繁重試時(shí),仍需深入分析根本原因!
到此這篇關(guān)于Pytest失敗重跑機(jī)制pytest-rerunfailures的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Pytest失敗重跑內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python使用requests xpath 并開(kāi)啟多線(xiàn)程爬取西刺代理ip實(shí)例
這篇文章主要介紹了Python使用requests xpath 并開(kāi)啟多線(xiàn)程爬取西刺代理ip實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03
使用scrapy ImagesPipeline爬取圖片資源的示例代碼
這篇文章主要介紹了使用scrapy ImagesPipeline爬取圖片資源的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Python如何查看并打印matplotlib中所有的colormap(cmap)類(lèi)型
這篇文章主要介紹了Python如何查看并打印matplotlib中所有的colormap(cmap)類(lèi)型,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
深入淺析pycharm中 Make available to all projects的含義
這篇文章主要介紹了pycharm中 Make available to all projects的含義,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
Python實(shí)現(xiàn)動(dòng)態(tài)二維碼生成的示例代碼
這篇文章主要和大家分享兩個(gè)制作二維碼的Python庫(kù),可以生成普通的二維碼、圖片背景版二維碼、動(dòng)圖GIF版二維。文中的示例代碼講解詳細(xì),感興趣的可以學(xué)習(xí)一下2022-05-05
Python中循環(huán)依賴(lài)問(wèn)題及其解決方案
在軟件開(kāi)發(fā)中,循環(huán)依賴(lài)是一個(gè)常見(jiàn)的問(wèn)題,尤其是在使用 Python 這樣的動(dòng)態(tài)語(yǔ)言時(shí),循環(huán)依賴(lài)指的是兩個(gè)或多個(gè)模塊或組件相互依賴(lài),形成一個(gè)閉環(huán),本文將探討 Python 中循環(huán)依賴(lài)的問(wèn)題,并提供一些解決方案,需要的朋友可以參考下2024-06-06
Django+Vue實(shí)現(xiàn)文件上傳下載的項(xiàng)目實(shí)踐
本文主要介紹了Django+Vue實(shí)現(xiàn)文件上傳下載的項(xiàng)目實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06

