2014-10-29 64 views
3

我們有一個jenkins測試套件的電子郵件報告編寫器。它使用Groovy腳本找到正確的報告,然後做出一個HTML報告,詳細說明測試狀態,最後一次跑,鏈接等Jenkins Groovy腳本發現null testResultAction成功運行

hudson.model.Hudson.instance.getItems(hudson.model.FreeStyleProject).each { project -> 
    if(project.name.contains(searchCriteria)){ 
     if(project.lastBuild.testResultAction == null){ 
      tr(){ 
       td(project.name)       
       td(){ 
        b("No Results") 
       } 
       ... 
      } 
     } 
     else{ 
      if(project.lastBuild.testResultAction.failCount > 0){ 
       tr(){ 
        td(project.name) 
        td(){ 
         b(style:'color:red', "FAIL") 
        } 

        ... 
       } 
      } 
      else{ 
      tr(){ 
        td(project.name) 
        td(){ 
         b(style:'color:red', "PASS") 
        } 

        ... 
       } 
      } 
     } 
    } 
} 

通常一切都正常運行,但具體構建最近開始一個或兩個一致返回爲「沒有結果」,即他們的.testResultAction爲null。我已經檢查了testResultAction的實際值,儘管他們運行了一個乾淨的測試,但Jenkins本身也是如此。

測試已重新運行,jenkins構建刪除並重新制作;沒有幫助。這個問題似乎困擾着某些不相關的構建。 Jenkins在這裏有一個特定的缺陷,我應該知道這會導致testResultAction默認爲null並且不會更改?否則,任何人都可以提出什麼可能會導致這種情況發生,或者我可以如何阻止它?

回答

3

該方法已被棄用,並且也給我null。我有更多的成功與此:

project.lastBuild.getAction(hudson.tasks.test.AggregatedTestResultAction.class) 

雖然它可以爲空,只是因爲項目中沒有測試。 無論如何,這裏有一個測試結果的方法,它適用於我。

def reportOnTestsForBuild(build) {  
    testResultAction = build.getAction(hudson.tasks.test.AggregatedTestResultAction.class); 

    if (testResultAction == null) { 
     println("No tests") 
     return 
    } 

    childReports = testResultAction.getChildReports(); 

    if (childReports == null || childReports.size() == 0) { 
     println("No child reports") 
     return 
    } 

    def failures = [:] 
    childReports.each { report -> 
     def result = report.result; 

     if (result == null) { 
      println("null result from child report") 
     } 
     else if (result.failCount < 1) { 
      println("result has no failures") 
     } 
     else { 
      println("overall fail count: ${result.failCount}") 
      failedTests = result.getFailedTests(); 

      failedTests.each { test -> 
       failures.put(test.fullDisplayName, test) 
       println("Failed test: ${test.fullDisplayName}\n" + 
         "name: ${test.name}\n" + 
         "age: ${test.age}\n" + 
         "failCount: ${test.failCount}\n" + 
         "failedSince: ${test.failedSince}\n" + 
         "errorDetails: ${test.errorDetails}\n") 
      } 
     } 
    } 
}