J'ai peaufiné le modèle de gelée standard pour afficher les résultats des tests actuels dans un tableau. Toutefois, je souhaite vraiment pouvoir afficher les différences comme indiqué dans la page des résultats des tests de Jenkins.
Par exemple:
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
Écrivez un modèle Groovy pour le plug-in Email Ext au lieu du modèle Jelly. Dans Groovy template, vous aurez accès à Build object pour votre construction. Vous pouvez ensuite appeler getTestResultAction dessus pour obtenir le AbstractTestResultAction pour la construction sur laquelle vous pouvez ensuite interroger tout ce dont vous avez besoin.
Voici un lien vers API du module principal Jenkins . Un exemple de modèle Groovy pour le plug-in Ext Email est disponible dans $JENKINS_HOME/plugins/email-ext/WEB-INF/classes/hudson/plugins/emailext/templates/groovy-html.template
. Plus d'informations sur l'utilisation des modèles/scripts Groovy sont disponibles dans Documentation du plug-in Email Ext .
Si vous avez du mal à y accéder via une API interne (difficile à connaître et qu'il existe toujours une limitation), il existe un autre moyen plus flexible de le faire.
Utiliser le jeton FILE au lieu du modèle groovy
email.html
sous l'espace de travailDefault Content
dans la configuration email-ext, utilisez le jeton FILE pour envoyer directement l’email ${FILE, path="email.html"}
À l'étape 1 ci-dessus, vous pouvez également utiliser un moyen plus souple pour votre propre modèle, j'utilise un script python et un modèle de chaîne simple.
Cela fonctionne parfaitement pour moi.
Pour développer cette réponse: Écrivez un modèle Groovy pour le plug-in Email Ext au lieu d'un modèle Jelly. Dans le contenu de notification par courrier électronique modifiable
et incluez le script groovy comme ceci:
$ {SCRIPT, template = "test.groovy"}
placez le script groovy dans les modèles de courrier électronique, par exemple /var/lib/jenkins/email-templates. voir ci-dessous test.groovy.
Dans l'exemple ci-dessous, chaque test est itéré en obtenant chacun de ces objets: '' 'junitResult.getChildren ()' ''. Si l'on souhaite itérer uniquement les tests ayant échoué, alors junitResult.getFailedTests () peut être utilisé. Voir l'API hudson.tasks.junit.TestResult: http://hudson-ci.org/javadoc/hudson/tasks/junit/PackageResult.html également voir http://hudson-ci.org/ javadoc/hudson/model/Build.html
Collection<ClassResult> getChildren()
List<CaseResult> getFailedTests()
Exemple/modèle de email-ext-plugin peut être vu ici: https://github.com/jenkinsci/email-ext-plugin/blob/master/src/main/resources/hudson/plugins/emailext /templates/groovy-html.template
Cet exemple présente le résultat du test récapitulatif et un tableau des résultats pour chaque suite de tests et chaque 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>
par exemple. sortie (texte seulement pas de couleurs/formatage)
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
Ma solution dans Jelly basée sur le script static-analysis.jelly par défaut
<!-- 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>