2012-10-15 295 views
1

我的測試中有一些代碼與某些外部服務一起工作。這項服務不是很穩定,所以有時候它會無緣無故地崩潰。但在80%的運行中,它運行良好。Autorerun失敗的rspec測試

所以我想要一種方法來自動重新運行所有失敗的rspecs幾次(例如2或3次)。 有什麼辦法可以做到嗎?

回答

1

而不是重新運行失敗的規格,你不能只是運行方法訪問服務的次數和運行結果的邏輯或期望?

所以不是:

it "returns expected value for some args" do 
    unstable_external_service(<some args>).should == <expected return value> 
end 

只是做這樣的事情:

def run_x_times(times, args) 
    return nil if times == 0 
    unstable_external_service(args) || run_x_times(times-1) 
end 

it "returns expected value for some args" do 
    run_x_times(10, <some args>).should == <expected return value> 
end 

您可以使用相同的包裝方法在整個測試中任何時候你訪問該服務。我假設你的服務在失敗時返回nil,但如果不是,你可以改變這個以適應你的特定情況 - 你會得到一般想法。

+0

的問題,外部服務可以沒有返回值,這將是正確的結果(例如「沒有對郵件沒有新郵件」),所以我不知道外部服務的使用情況可能被標記爲'正確'的條件 – ShockwaveNN

+0

那麼你在測試期望什麼?無論價值是多少,只需檢查幾次,如果它匹配一次,那麼在預期中使用該值。 –

+0

謝謝,我認爲這將是我的備份計劃,如果沒有簡單的方法來重新運行失敗的規格 – ShockwaveNN

2

很多人會說你的測試實際上不應該打外部服務,這就是做這件事的原因之一。您的測試不應該失敗,因爲某些外部服務已關閉。

TL; DR使用嘲弄和存根或更換這些外部服務調用

+0

Webmock是一個很好的方式來做到這一點:https://github.com/bblimke/webmock –

+0

VCR(https:// github .com/vcr/vcr)也是一個不錯的方法。它將首次呼叫記錄到外部服務並將其保存到「磁帶」中。下次測試運行時,它會直接使用卡帶而不是外部服務。 – mcginniwa