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