2013-09-26 138 views
1

我們正在通過jenkins服務器運行一套Frank/cucumber測試來測試iOS應用。黃瓜 - 詹金斯重新運行失敗測試

這些測試本地運行得很好,並且在jenkins服務器上手動運行也是如此。但是,當通過jenkins時,我們偶爾會遇到導致構建失敗的錯誤,當我們再次運行jenkins時(即按下'Build now'按鈕),無需更改任何內容即可正常工作。

我們運行下面的代碼來運行測試:

cucumber features/ipad --tags [email protected] 

我接着又說了重新運行參數失敗的測試轉儲到一個文本文件:

-f rerun -o rerun.txt 

然後跑去黃瓜重新運行。 TXT直後,所以它整個comman看起來像這樣:

cucumber features/ipad --tags [email protected] -f rerun -o rerun.txt; cucumber @rerun.txt 

這工作正常,我t捕獲失敗的測試,並在其他測試後重新執行它們。

但是,jenkins仍然將構建標記爲失敗,即使重新運行通過。

有沒有辦法告訴黃瓜或詹金斯忽略第一次測試運行,並且只將重新運行測試標記爲合格或失敗?

或者有沒有更好的方法呢?

感謝

回答

4

詹金斯腳本非常簡單。腳本失敗時構建失敗,即具有非零的退出代碼。

另外,如果您使用junit插件發佈您的結果,請確保插件在結果中找到失敗的測試時不會失敗您的構建。

但是,試着找出測試失敗的原因。總是獲取測試運行的應用程序日誌,並檢查那裏發生的事情。如果自動化測試不可靠,請使用手動測試。

此外,只要測試失敗,您就可以使用黃瓜鉤子截取屏幕截圖。當你試圖理解失敗的測試時,這是一個很大的幫助。

+0

我認爲你和Peter是正確的,因爲測試需要重寫/重新考慮,以免出現這些錯誤。當測試在本地運行良好時,這是令人沮喪的,但通過jenkins失敗沒有明顯的原因。我會檢查我們是否使用junit。謝謝! – MichalT

+1

@MichalT檢查控制檯日誌,該日誌應該準確顯示構建失敗的原因。無論如何,弗蘭克手勢有問題,他們不可靠。如果您只使用簡單的觸摸,測試可能會失敗的原因有幾個,例如動作之間的小延遲(使用'wait_for_nothing_to_be_animating'而不是睡覺)。我遇到了同樣的問題,我的測試完全在本地運行。然而,事實證明jenkins失敗幾乎總是由測試中的問題引起的 - 或者是隨機出現的真正bug。總是試圖理解測試失敗的原因。 – Sulthan

1

對不起,如果我無知或者只是不明白黃瓜的理念,但未能測試通常有一個理由。一般來說,找出你的測試失敗的原因,然後解決這個問題(或你的測試)。

要更直接地回答您的問題,您可以查看Log Parser Plugin。我的直覺告訴我,當一個測試用例失敗時,詹金斯正確地將工作標記爲失敗(或者更好的是不穩定)。

+0

感謝。測試運行正常,但偶爾失敗時,iOS模擬器掛起,或任何數量(似乎)其他小的非代碼相關的問題。大多數時候構建失敗時,我們只是重新運行構建,它的工作原理。我希望有一種方法可以自動化重新運行,而不會導致構建首先失敗。 – MichalT

+0

你有沒有找到解決這個問題的辦法,我和你有同樣的問題。 @MichalT –

+0

不是真的我害怕。通過確保ruby和相關的gem被更新,我們使它更加穩定,b)和本地機器上運行的一樣(我們沒有問題)。我們也會定期重啓,這似乎有助於...... @ deluded12ga – MichalT

0

你爲什麼不嘗試使用常規

def getResults(){ 
AbstractTestResultAction testResultAction = currentBuild.rawBuild.getAction(AbstractTestResultAction.class) 
       def failCount = null 
       def failureDiffString = null 
       def totalCount = null 
       def passed = null 
       def passrate = null 
       if (testResultAction != null) { 
        failCount = testResultAction.failCount 
        totalCount = testResultAction.totalCount 
        passed = totalCount - failCount 
        passrate = (passed/totalCount*100).toInteger() 
        } 

      return passrate 
} 

,讓您的測試結果,你可以使用這樣的事情:

if(getResults() >= 95){ 
    currentBuild.result="SUCCESS" 
    } else { 
     currentBuild.result="FAILED" 
     throw new Exception("Pass rate lower than 95%") 
    }