2012-07-04 7 views
10

Ho modificato il modello standard di gelatina per visualizzare i risultati del test corrente in una tabella, tuttavia voglio davvero essere in grado di visualizzare diffs come visto nella pagina dei risultati del test di Jenkins.Come posso scrivere un modello di email-ext di Jenkins per visualizzare i risultati del test come il rapporto di prova standard

Ad esempio:

JUnit Tests: 0 failures (±0) , 1 skipped (+1) 

Package    Duration Fail (diff) Skip (diff) Total (diff) 
foo.bar.baz    89 ms  0  0  1  +1  5  +2 

risposta

9

Scrivi un modello Groovy per e-mail Ext plug invece di modello di gelatina. Nel modello Groovy avrai accesso all'oggetto Build per la tua build. È quindi possibile chiamare getTestResultAction per ottenere lo AbstractTestResultAction per la build, quindi è possibile richiedere tutto ciò di cui si ha bisogno.

Questo è un collegamento a Jenkins Main Module API. Un modello Groovy di esempio per il plug-in Ext Email è disponibile in $JENKINS_HOME/plugins/email-ext/WEB-INF/classes/hudson/plugins/emailext/templates/groovy-html.template. Maggiori informazioni sull'utilizzo del modello/script Groovy sono disponibili in Email Ext plugin documentation.

+0

@Jon, questa risposta è stata utile? –

+0

Sono riuscito a estrarre i test non riusciti utilizzando build.testResultAction.failedTests, ma non sono sicuro di come accedere a tutti i test –

+1

Sembra che l'accesso a PackageResult dipenda dal tipo restituito da getTestResultAction - AggregatedTestResultAction e TestResultAction richiedono una gestione diversa. –

3

Se siete in difficoltà su come accedervi tramite l'API interna (difficile da conoscere ed esiste sempre una limitazione), esiste un altro modo più flessibile per farlo.

Utilizzando file token invece di template groove

  1. utilizzando script per accedere ai dati di test tramite Jenkins API, per il vostro caso, è come http://jenkins.server/job/yourjob/lastCompletedBuild/testReport/api/xml e generare il proprio file html come email.html sotto l'area di lavoro
  2. in Default Content modulo nella configurazione di email-ext, utilizzando file token per inviare l'e-mail direttamente ${FILE, path="email.html"}

Nel passo 1 sopra, puoi anche usare un modo più flessibile per il tuo modello, io uso lo script python e il modello di stringa semplice.

Funziona perfettamente per me.

+0

Ti piacerebbe condividere lo script che hai descritto come passaggio 1? – callisto

+3

Se si utilizza il formato HTML, è necessario utilizzare '$ {SCRIPT, template =" groovy-html.template "}' invece di '$ {FILE}'. –

+0

Puoi per favore essere dettagliato su questo. Penso di aver bisogno di fare cose simili. Volevo visualizzare il messaggio di commit git completo da git nell'email. Ma mostra solo la prima riga. Penso di aver bisogno di scrivere qualche script .. – sharp

1

La mia soluzione a Jelly basandosi su script predefinito statico-analysys.jelly

<!-- JUnit TEMPLATE --> 
    <j:set var="junitResultList" value="${it.JUnitTestResult}" /> 
    <j:if test="${junitResultList.isEmpty()!=true}"> 
    <div class="content"> 
     <a href="${rooturl}${build.url}/testReport"> 
     <h1>JUnit Tests</h1> 
     </a> 
     <table class="border"> 
     <tr> 
      <th class="border">Package</th> 
      <th class="border">Failed</th> 
      <th class="border">Failed (diff)</th> 
      <th class="border">Passed</th> 
      <th class="border">Passed (diff)</th> 
      <th class="border">Skipped</th> 
      <th class="border">Skipped (diff)</th> 
      <th class="border">Total</th> 
      <th class="border">Total (diff)</th> 
     </tr> 
     <j:forEach var="junitResult" items="${it.JUnitTestResult}"> 
      <j:forEach var="packageResult" items="${junitResult.getChildren()}"> 
      <tr> 
       <td class="border"> 
       <tt>${packageResult.getName()}</tt> 
       </td> 
       <td class="border test_failed">${packageResult.getFailCount()}</td> 
       <td class="border test_failed">${packageResult.getFailCount()-packageResult.previousResult.getFailCount()}</td> 
       <td class="border test_passed">${packageResult.getPassCount()}</td> 
       <td class="border test_passed">${packageResult.getPassCount()-packageResult.previousResult.getPassCount()}</td> 
       <td class="border test_skipped">${packageResult.getSkipCount()}</td> 
       <td class="border test_skipped">${packageResult.getSkipCount()-packageResult.previousResult.getSkipCount()}</td> 
       <td class="border"> 
       <b>${packageResult.getPassCount()+packageResult.getFailCount()+packageResult.getSkipCount()} 
       </b> 
       </td> 
       <td class="border"> 
       <b>${packageResult.getPassCount()+packageResult.getFailCount()+packageResult.getSkipCount()-packageResult.previousResult.getPassCount()-packageResult.previousResult.getFailCount()-packageResult.previousResult.getSkipCount()} 
       </b> 
       </td> 
      </tr> 
      <j:forEach var="failed_test" 
       items="${packageResult.getFailedTests()}"> 
       <tr> 
       <td class="test_failed" colspan="5"> 
        <tt>${failed_test.getFullName()}</tt> 
       </td> 
       </tr> 
      </j:forEach> 
      </j:forEach> 
     </j:forEach> 
     </table> 
     <br /> 
    </div> 
    </j:if> 
3

Per espandere su questa risposta: Scrivi un modello Groovy per e-mail Ext plug invece di modello di gelatina. Nel contenuto di notifica modificabile Email

  • tipo di contenuto impostato su "HTML" o "Entrambi HTML e Testo normale"
  • e includere lo script Groovy in questo modo:

    $ {SCRIPT, template =" test.groovy "}

  • inserire lo script groovy nei modelli di e-mail, ad es. /var/lib/jenkins/email-templates. vedi sotto test.groovy.

Nell'esempio che segue ogni prova viene iterata ottenendo ognuno di questi oggetti: '' 'junitResult.getChildren()' ''. Se si desidera eseguire l'iterazione solo per i test non riusciti, è possibile utilizzare junitResult.getFailedTests(). Vedi l'hudson.tasks.junit.TestResult API: http://hudson-ci.org/javadoc/hudson/tasks/junit/PackageResult.html vedi anche http://hudson-ci.org/javadoc/hudson/model/Build.html

Collection<ClassResult> getChildren() 
List<CaseResult> getFailedTests() 

Esempio/modello dal email-ext-plugin può essere visto qui: https://github.com/jenkinsci/email-ext-plugin/blob/master/src/main/resources/hudson/plugins/emailext/templates/groovy-html.template

Questo esempio mostra il risultato del test di sintesi e la tabella per i risultati per ogni suite di test e individuale test. test.groovy:

<html> 
<body> 
<% 

    import hudson.model.* 

    def build = Thread.currentThread().executable 
    def buildNumber = build.number 
    def buildNumHash = build.getDisplayName() 

    def testCount = "0" 
    def testPassed = "0" 
    def testFailed = "0" 
    def testSkipped = "0" 
    def buildDuration = "0" 
    if(build.testResultAction) { 
     def testResult = build.testResultAction 
     testCount = String.format("%d",(testResult.totalCount)) 
     testPassed = String.format("%d",(testResult.result.passCount)) 
     testFailed = String.format("%d",(testResult.result.failCount)) 
     testSkipped = String.format("%d",(testResult.result.skipCount)) 
     testDuration = String.format("%.2f",(testResult.result.duration)) 
    } 

    def workspace = build.getEnvVars()["WORKSPACE"] 
    def buildName = build.getEnvVars()["JOB_NAME"] 
    def BUILD_STATUS = build.getEnvVars()["BUILD_STATUS"] 
    def BUILD_URL = build.getEnvVars()["BUILD_URL"] 

    def testResult = hudson.tasks.junit.TestResult 

    def testResult2 = build.getAction(hudson.tasks.junit.TestResultAction.class) 

%> 

start test.groovy <br><br> 
<b>TEST RESULT:</b> $testCount total, <b>$testPassed pass</b>, <b>$testFailed fail</b>, $testSkipped skip.<br> 
Workspace : $workspace<br> 
Project Name : $buildName $buildNumHash<br><br> 

<!-- GENERAL INFO --> 

<TABLE> 
    <TR><TD align="right"> 
    <j:choose> 
     <j:when test="${build.result=='SUCCESS'}"> 
     <IMG SRC="${rooturl}static/e59dfe28/images/32x32/blue.gif" /> 
     </j:when> 
      <j:when test="${build.result=='FAILURE'}"> 
     <IMG SRC="${rooturl}static/e59dfe28/images/32x32/red.gif" /> 
     </j:when> 
     <j:otherwise> 
     <IMG SRC="${rooturl}static/e59dfe28/images/32x32/yellow.gif" /> 
     </j:otherwise> 
    </j:choose> 
    </TD><TD valign="center"><B style="font-size: 200%;">BUILD ${build.result}</B></TD></TR> 
    <TR><TD>Build URL</TD><TD><A href="${rooturl}${build.url}">${rooturl}${build.url}</A></TD></TR> 
    <TR><TD>Project:</TD><TD>${project.name}</TD></TR> 
    <TR><TD>Date of build:</TD><TD>${it.timestampString}</TD></TR> 
    <TR><TD>Build duration:</TD><TD>${build.durationString}</TD></TR> 
    <TR><TD>Test duration:</TD><TD>${testDuration}</TD></TR> 
</TABLE> 
<BR/> 

<!-- JUnit TEMPLATE hudson.tasks.junit.TestResult --> 

<% def junitResultList = it.JUnitTestResult 
try { 
def cucumberTestResultAction = it.getAction("org.jenkinsci.plugins.cucumber.jsontestsupport.CucumberTestResultAction") 
junitResultList.add(cucumberTestResultAction.getResult()) 
} catch(e) { 
     //cucumberTestResultAction not exist in this build 
} 
// API: http://hudson-ci.org/javadoc/hudson/tasks/junit/PackageResult.html 
%> 

<!-- JUnit TEMPLATE: all tests PASS FAIL SKIP > 
<% 
if (junitResultList.size() > 0) { %> 
<TABLE width="100%"> 
<TR><TD class="bg1" colspan="2"><B>${junitResultList.first().displayName}</B></TD></TR> 
<% junitResultList.each{ 
    junitResult -> %> 
    <% junitResult.getChildren().each { packageResult -> %> 
     <TR><TD class="bg2" colspan="2"> <B>TEST SUITE: ${packageResult.getName()} Failed: ${packageResult.getFailCount()} test(s), Passed: ${packageResult.getPassCount()} test(s)</B>, Skipped: ${packageResult.getSkipCount()} test(s), Total: ${packageResult.getPassCount()+packageResult.getFailCount()+packageResult.getSkipCount()} test(s)</TD></TR> 
     <% packageResult.getChildren().each{ suite -> 
       suite.getChildren().each{ test -> 
      def colour = "lightgreen" 
      def highlight1="" 
      def highlight2="" 
      RESULT = test.getStatus() // FAILED or PASSED or SKIPPED 
      if (RESULT == hudson.tasks.junit.CaseResult.Status.FAILED || RESULT == hudson.tasks.junit.CaseResult.Status.REGRESSION) { 
       colour = "#ffcccc" 
       highlight1="<B>" 
       highlight2="</B>" 
      } 
      if (RESULT == hudson.tasks.junit.CaseResult.Status.SKIPPED) { colour = "#ffffb3" } 
     %> 
      <TR bgcolor="${colour}"><TD class="test" colspan="2">${highlight1}<li>${RESULT}: ${test.getFullName()} </li>${highlight2}</TD></TR> 
     <% } } 
     } 
} %> 
</TABLE> 
<BR/> 
<% 
} %> 

end of test.groovy 

</body> 
</html> 

ad es. output (solo testo senza colori/formattazione)

start test.groovy 

TEST RESULT: 18 total, 18 pass, 0 fail, 0 skip. 
Workspace : /var/lib/jenkins/jobs/jobname-1/workspace 
Project Name : jobname-1 #20 

BUILD SUCCESS 

Build URL http://jenkinsurl:port/job/jobname-1/20/ 
Project: jobname-1 
Date of build: Mon, 23 Jan 2017 09:29:00 +0000 
Build duration: 10 min 
Test duration: 267.12 

Test Results 
TEST SUITE: suitename1 Failed: 0 test(s), Passed: 3 test(s), Skipped: 0 test(s), Total: 3 test(s) 
* PASSED: suitename1.testclass.testname1 
* PASSED: suitename1.testclass.testname2 
* PASSED: suitename1.testclass.testname3 
TEST SUITE: suitename2 Failed: 2 test(s), Passed: 1 test(s), Skipped: 0 test(s), Total: 3 test(s) 
* PASSED: suitename2.testclass.testname1 
* FAILED: suitename2.testclass.testname2 
* REGRESSION: suitename2.testclass.testname3 

end of test.groovy 
Problemi correlati