pytest(13):pytest失敗重跑外掛: pytest-rerunfailures使用
背景
在編寫介面case的時候,我們常遇到一個這樣的問題:
測試環境不穩定偶發介面超時(和服務無關,純粹是環境問題),然後執行介面case也因此偶發失敗。比如同一個介面case跑五次,其中有兩次失敗,另外三次都是成功的,這種偶發性的環境問題就需要我們手動重跑(還不一定能夠通過)。有沒有一個比較好的機制,保證case能夠盡最大努力通過測試呢?
這裡我們介紹pytest的一個失敗重跑外掛:pytest-rerunfailures
介紹
pytest-rerunfailures是一個通過重跑機制來消除不穩定失敗的pytest外掛。
安裝外掛
pip3 install pytest-rerunfailures -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
提前瞭解重點
命令列引數:--reruns n(重新執行次數),--reruns-delay m(等待執行秒數)
裝飾器引數:reruns=n(重新執行次數),reruns_delay=m(等待執行秒數)
重新執行所有失敗的用例
要重新執行所有測試失敗,使用--reruns命令列選項,並指定要執行測試的最大次數:
pytest --reruns 5 -s
新增重新執行的延時
要在兩次重試之間增加延遲時間,使用--reruns-delay命令列選項,指定下次測試重新開始之前等待的秒數
pytest --reruns 5 --reruns-delay 10 -s
重新執行指定的測試用例
要將單個測試用例新增flaky裝飾器@pytest.mark.flaky(reruns=5),並在測試失敗時自動重新執行,需要指定最大重新執行的次數
例子1
指定失敗重跑最大次數為10:pytest --reruns 10
如下圖,我們看到一共跑了兩次,第一次結果失敗,所以重跑了第二次,最終結果用R標註。(如果跑一次就成功,結果應該是'.')
例子2
指定失敗重跑最大次數為10,重跑間隔為1秒:pytest --reruns 10 --reruns-delay 1
如下圖,一共重跑了兩次,重跑兩次的執行時間為2.1秒,上圖中一次只需要0.07秒,這裡多出的兩秒就是因為--reruns-delay指定的重跑間隔為1秒。
例子3
import pytest @pytest.mark.flaky(reruns=5) def test_example(): import random assert random.choice([True, False, False])
同樣的,這個也可以指定重新執行的等待時間
@pytest.mark.flaky(reruns=5, reruns_delay=2) def test_example(): import random assert random.choice([True, False, False])
注意事項
如果指定了用例的重新執行次數,則在命令列新增--reruns對這些用例是不會生效的