2012-07-04 23 views
10

He modificado la plantilla estándar de gelatina para mostrar los resultados de la prueba actual en una tabla, sin embargo, realmente quiero poder mostrar diffs visto en la página de resultados de pruebas propias de Jenkins.¿Cómo puedo escribir una plantilla de correo electrónico de Jenkins para mostrar los resultados de prueba como el informe de prueba estándar

Por ejemplo:

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 

Respuesta

9

Escribe una plantilla maravillosa para correo electrónico Ext Plugin de plantilla en lugar de jalea. En la plantilla de Groovy tendrá acceso al objeto Build para su compilación. A continuación, puede llamar al getTestResultAction para obtener el AbstractTestResultAction para la compilación que luego puede consultar para todo lo que necesita.

Aquí hay un enlace a Jenkins Main Module API. Se puede encontrar una plantilla Groovy de ejemplo para el complemento Ext Email en $JENKINS_HOME/plugins/email-ext/WEB-INF/classes/hudson/plugins/emailext/templates/groovy-html.template. Se puede encontrar más información sobre el uso de la plantilla/script de Groovy en Email Ext plugin documentation.

+0

@Jon, ¿Le sirve la respuesta? –

+0

He logrado eliminar las pruebas fallidas usando build.testResultAction.failedTests, pero no estoy seguro de cómo acceder a todas las pruebas –

+1

Parece que el acceso al PackageResult depende del tipo devuelto por getTestResultAction - AggregatedTestResultAction & TestResultAction requiere un manejo diferente. –

3

Si tiene problemas para acceder a él a través de la API interna (es difícil de conocer y siempre existe la limitación), existe otra forma más flexible de hacerlo.

mediante el testigo de archivo en lugar de la plantilla maravilloso

  1. mediante secuencias de comandos para acceder a los datos de prueba a través de Jenkins API, para su caso, es como http://jenkins.server/job/yourjob/lastCompletedBuild/testReport/api/xml y generar su propio archivo HTML como email.html bajo el espacio de trabajo
  2. en Default Content forma en la configuración de correo electrónico-ext, con el token de archivo para enviar el correo electrónico directamente ${FILE, path="email.html"}

En el paso 1 anterior, también puede usar una forma más flexible para su propia plantilla, utilizo la secuencia de comandos python y la plantilla de cadena simple.

Funciona perfecto para mí.

+0

¿Le importaría compartir el script que describió como el paso 1? – callisto

+3

Si usa formato HTML, necesitará usar '$ {SCRIPT, template =" groovy-html.template "}' en lugar de '$ {FILE}'. –

+0

¿Podrían por favor ser detalles sobre este. Creo que necesito hacer algo similar. Quería mostrar el mensaje completo de cometer git de git en el correo electrónico. Pero muestra solo la primera línea. Creo que necesito escribir algunos guiones ... – sharp

1

Mi solución Jelly basándose en la escritura estática por defecto-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

Para ampliar esta respuesta: Escribe una plantilla maravillosa para correo electrónico Ext Plugin de plantilla en lugar de jalea. En Contenido de la notificación editable electrónico

  • tipo de contenido ajustado a "HTML" o "Ambos HTML y texto sin formato"
  • e incluyen el guión maravilloso como esto:

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

  • pon el script groovy en plantillas de correo electrónico, por ejemplo, inicio /var/lib/jenkins/email-templates. ver debajo test.groovy.

En el siguiente ejemplo se repite cada prueba por conseguir cada uno de estos objetos: '' 'junitResult.getChildren()' ''. Si se desea iterar solo las pruebas fallidas, se puede usar junitResult.getFailedTests(). Ver hudson.tasks.junit.TestResult API: http://hudson-ci.org/javadoc/hudson/tasks/junit/PackageResult.html también ver http://hudson-ci.org/javadoc/hudson/model/Build.html

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

Ejemplo/formato de correo electrónico-ext-plugin se puede ver aquí: https://github.com/jenkinsci/email-ext-plugin/blob/master/src/main/resources/hudson/plugins/emailext/templates/groovy-html.template

Este ejemplo muestra resultados de la prueba sumaria y tabla de resultados para cada conjunto de pruebas e individual prueba. 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> 

e.g. salida (solo texto sin colores/formato)

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 
Cuestiones relacionadas