1. 程式人生 > 其它 >pytest(13):pytest失敗重跑外掛: pytest-rerunfailures使用

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對這些用例是不會生效的