Show JUnit test results in email notifications

2,985 views
Skip to first unread message

Uri Moszkowicz

unread,
Oct 12, 2011, 12:46:34 PM10/12/11
to jenkins...@googlegroups.com
When builds become unstable, how do I show the JUnit test results in the email? The email just includes a link to see the results by default.

Kamal Ahmed

unread,
Oct 12, 2011, 12:51:36 PM10/12/11
to jenkins...@googlegroups.com
use email-ext, with cust.jelly
i think email-ext has an example
-Kamal.

Kamal Ahmed

unread,
Oct 12, 2011, 1:34:43 PM10/12/11
to jenkins...@googlegroups.com
Is it possible to display 2 seperate graphs of sloccount ?
i run sloccount against two different modules withon the same repository, and have 2 seperate sloccount.sc files
Question is how can i display them seperately.

Thanks,
-Kamal.

Uri Moszkowicz

unread,
Oct 12, 2011, 2:56:51 PM10/12/11
to jenkins...@googlegroups.com
Seems to have worked. Unfortunately, it doesn't seem to show the stack trace. Does anyone know of a template that I can download which does this? I'm migrating from Cruise Control and am looking for similar functionality.

Kamal Ahmed

unread,
Oct 12, 2011, 3:55:10 PM10/12/11
to jenkins...@googlegroups.com
use failed_test.errorStackTrace

Maxime Lemanissier

unread,
Oct 13, 2011, 7:27:12 AM10/13/11
to jenkins...@googlegroups.com
I'm also interested in this topic.
I make it work with failed_test.getErrorStackTrace()

But the output is not really adapted, I would like to get only the assertion
error. Is there a way to do this?
I tried failed_test.getErrorStackTrace(10) (I guessed such a method, as for
build.getLog(100) would exist) but it does not work.
The problem is I don't know how to match jelly queries with objects
available in Jenkins model. Maybe a method getAssertionError() is available
for failed_test, but as I don't know which object it is, I can only make
guess...

In fact, I have exactly the same problem than
http://jenkins.361315.n4.nabble.com/Request-for-more-email-ext-jelly-templates-examples-td3038571.html

How can objects be matched between jelly script and Jenkins model?
Are there others examples than the 2 templates provided in the email ext
plugin page?

Thx

--
View this message in context: http://jenkins.361315.n4.nabble.com/Show-JUnit-test-results-in-email-notifications-tp3898704p3901191.html
Sent from the Jenkins users mailing list archive at Nabble.com.

Sven Finsterwalder

unread,
Sep 19, 2012, 7:00:25 AM9/19/12
to jenkins...@googlegroups.com
what is the correct to get the stack trace?
1)  failed_test.errorStackTrace 
or
2) failed_test.getErrorStackTrace()

I try it with the second and it does not work :-(
JellyException: Could not parse Jelly script : null 

Kamal Ahmed

unread,
Sep 19, 2012, 9:12:06 AM9/19/12
to jenkins...@googlegroups.com
try this as an example (you might have to tweek a bit)

 more cust.jelly
<j:jelly xmlns:j="jelly:core" xmlns:st="jelly:stapler" xmlns:d="jelly:define">

<STYLE>
BODY, TABLE, TD, TH, P {
font-family:Verdana,Helvetica,sans serif;
font-size:11px;
color:black;
}
h1 { color:black; }
h2 { color:black; }
h3 { color:black; }
TD.bg1 { color:white; background-color:#0000C0; font-size:120% }
TD.bg2 { color:white; background-color:#4040FF; font-size:110% }
TD.bg3 { color:white; background-color:#8080FF; }
TD.test_passed { color:blue; }
TD.test_failed { color:red; }
TD.console { font-family:Courier New; }
</STYLE>
<BODY>
<j:set var="spc" value="&amp;nbsp;&amp;nbsp;" />

<!-- 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>
</TABLE>
<BR/>

<!-- CHANGE SET -->

<j:set var="changeSet" value="${build.changeSet}" />
<j:if test="${changeSet!=null}">
<j:set var="hadChanges" value="false" />
<TABLE width="100%">
<TR><TD class="bg1" colspan="2"><B>CHANGES</B></TD></TR>
<j:forEach var="cs" items="${changeSet}" varStatus="loop">
<j:set var="hadChanges" value="true" />
<j:set var="aUser" value="${cs.hudsonUser}"/>
<TR>
<TD colspan="2" class="bg2">${spc}Revision <B>${cs.commitId?:cs.revision?:cs.changeNumber}</B> by
<B>${aUser!=null?aUser.displayName:cs.author.displayName}: </B>
<B>(${cs.msgAnnotated})</B>
</TD>
</TR>
<j:forEach var="p" items="${cs.affectedFiles}">
<TR>
<TD width="10%">${spc}${p.editType.name}</TD>
<TD>${p.path}</TD>
</TR>
</j:forEach>
</j:forEach>
<j:if test="${!hadChanges}">
<TR><TD colspan="2">No Changes</TD></TR>
</j:if>
</TABLE>
<BR/>
</j:if>

<!-- ARTIFACTS -->

<j:set var="artifacts" value="${build.artifacts}" />
<j:if test="${artifacts!=null and artifacts.size()&gt;0}">
<TABLE width="100%">
<TR><TD class="bg1"><B>BUILD ATRIFACTS</B></TD></TR>
<TR>
<TD>
<j:forEach var="f" items="${artifacts}">
<li>
<a href="${rooturl}${build.url}artifact/${f}">${f}</a>
</li>
</j:forEach>
</TD>
</TR>
</TABLE>
<BR/>
</j:if>

<!-- MAVEN ARTIFACTS -->

<j:set var="mbuilds" value="${build.moduleBuilds}" />
<j:if test="${mbuilds!=null}">
<TABLE width="100%">
<TR><TD class="bg1"><B>BUILD ATRIFACTS</B></TD></TR>
<j:forEach var="m" items="${mbuilds}">
<TR><TD class="bg2"><B>${m.key.displayName}</B></TD></TR>
<j:forEach var="mvnbld" items="${m.value}">
<j:set var="artifacts" value="${mvnbld.artifacts}" />
<j:if test="${artifacts!=null and artifacts.size()&gt;0}">
<TR>
<TD>
<j:forEach var="f" items="${artifacts}">
<li>
<a href="${rooturl}${mvnbld.url}artifact/${f}">${f}</a>
</li>
</j:forEach>
</TD>
</TR>
</j:if>
</j:forEach>
</j:forEach>
</TABLE>
<BR/>
</j:if>

<!-- JUnit TEMPLATE -->

<j:set var="junitResultList" value="${it.JUnitTestResult}" />
<j:if test="${junitResultList.isEmpty()!=true}">
<TABLE width="100%">
<TR><TD class="bg1" colspan="2"><B>Praefectus Nose Unit Tests</B></TD></TR>
<j:forEach var="junitResult" items="${it.JUnitTestResult}">
<j:forEach var="packageResult" items="${junitResult.getChildren()}">
<TR><TD class="bg2" colspan="2"> Name: ${packageResult.getName()} Failed: ${packageResult.getFailCount()} test(s), Passed: ${packageResult.getPassCount()} tes
t(s), Skipped: ${packageResult.getSkipCount()} test(s), Total: ${packageResult.getPassCount()+packageResult.getFailCount()+packageResult.getSkipCount()} test(
s)</TD></TR>
<j:forEach var="failed_test" items="${packageResult.getFailedTests()}">
<TR bgcolor="white"><TD class="test_failed" colspan="2"><B><li>Failed: ${failed_test.getFullName()}<br/><pre>${failed_test.errorDetails}</pre></li></B></TD></
TR>
<TR bgcolor="white"><TD class="test_failed" colspan="2"><B><li>StackTrace: ${failed_test.getFullName()}<br/><pre>${failed_test.errorStackTrace}</pre></li></B>
</TD></TR>
</j:forEach>
</j:forEach>
</j:forEach>
</TABLE>
<BR/>
</j:if>

<!-- COBERTURA TEMPLATE -->

<j:set var="coberturaAction" value="${it.coberturaAction}" />
<j:if test="${coberturaAction!=null}">
<j:set var="coberturaResult" value="${coberturaAction.result}" />
<j:if test="${coberturaResult!=null}">
<table width="100%"><TD class="bg1" colspan="2"><B>Cobertura Report</B></TD></table>
<table width="100%"><TD class="bg2" colspan="2"><B>Project Coverage Summary</B></TD></table>
<table border="1px" class="pane">
<tr>
<td>Name</td>
<j:forEach var="metric" items="${coberturaResult.metrics}">
<td>${metric.name}</td>
</j:forEach>
</tr>
<tr>
<td>${coberturaResult.name}</td>
<j:forEach var="metric" items="${coberturaResult.metrics}">
<td data="${coberturaResult.getCoverage(metric).percentageFloat}">${coberturaResult.getCoverage(metric).percentage}%
(${coberturaResult.getCoverage(metric)})
</td>
</j:forEach>
</tr>
</table>

<j:if test="${coberturaResult.sourceCodeLevel}">
<h2>Source</h2>
<j:choose>
<j:when test="${coberturaResult.sourceFileAvailable}">
<div style="overflow-x:scroll;">
<table class="source">
<thead>
<tr>
<th colspan="3">${coberturaResult.relativeSourcePath}</th>
</tr>
</thead>
${coberturaResult.sourceFileContent}

</table>
</div>
</j:when>
<j:otherwise>
<p>
<i>Source code is unavailable</i>
</p>
</j:otherwise>
</j:choose>
</j:if>

<j:forEach var="element" items="${coberturaResult.childElements}">
<j:set var="childMetrics" value="${coberturaResult.getChildMetrics(element)}"/>
<table width="100%"><TD class="bg2" colspan="2">Coverage Breakdown by ${element.displayName}</TD></table>
<table border="1px" class="pane sortable">
<tr>
<td>Name</td>
<j:forEach var="metric" items="${childMetrics}">
<td>${metric.name}</td>
</j:forEach>
</tr>
<j:forEach var="c" items="${coberturaResult.children}">
<j:set var="child" value="${coberturaResult.getChild(c)}"/>
<tr>

<td>
${child.xmlTransform(child.name)}
</td>
<j:forEach var="metric" items="${childMetrics}">
<j:set var="childResult" value="${child.getCoverage(metric)}"/>
<j:choose>
<j:when test="${childResult!=null}">
<td data="${childResult.percentageFloat}">${childResult.percentage}%
(${childResult})
</td>
</j:when>
<j:otherwise>
<td data="101">N/A</td>
</j:otherwise>
</j:choose>
</j:forEach>
</tr>
</j:forEach>
</table>
</j:forEach>
</j:if>
<BR/>
</j:if>

<!-- CONSOLE OUTPUT -->

<j:getStatic var="resultFailure" field="FAILURE" className="hudson.model.Result"/>
<j:if test="${build.result==resultFailure}">
<TABLE width="100%" cellpadding="0" cellspacing="0">
<TR><TD class="bg1"><B>CONSOLE OUTPUT</B></TD></TR>
<j:forEach var="line" items="${build.getLog(100)}"><TR><TD class="console">${line}</TD></TR></j:forEach>
</TABLE>
<BR/>
</j:if>

</BODY>
</j:jelly>

Hope this helps.
-Kamal.


From: Sven Finsterwalder <sab...@gmail.com>
To: jenkins...@googlegroups.com
Sent: Wednesday, September 19, 2012 7:00 AM
Subject: Re: Show JUnit test results in email notifications

what is the correct to get the stack trace?
1)  failed_test.errorStackTrace 
or
2) failed_test. getErrorStackTrace()

I try it with the second and it does not work :-(
JellyException: Could not parse Jelly script : null 


Am Donnerstag, 13. Oktober 2011 13:27:12 UTC+2 schrieb Maxime Lemanissier:
I'm also interested in this topic.
I make it work with failed_test. getErrorStackTrace()
But the output is not really adapted, I would like to get only the assertion
error. Is there a way to do this?
I tried failed_test. getErrorStackTrace(10) (I guessed such a method, as for

build.getLog(100) would exist) but it does not work.
The problem is I don't know how to match jelly queries with objects
available in Jenkins model. Maybe a method getAssertionError() is available
for failed_test, but as I don't know which object it is, I can only make
guess...

Sven Finsterwalder

unread,
Sep 20, 2012, 2:00:14 AM9/20/12
to jenkins...@googlegroups.com, u...@4refs.com
Hello Kamal,

thank you for your answer.
Is there any documentation of that API?

Ahmed

unread,
Apr 30, 2015, 6:14:33 AM4/30/15
to jenkins...@googlegroups.com, kamal22...@yahoo.com
Dear Kamal,

Kindly let me know where to place cust.jelly in .jenkins directory once we customize and how to use in jenkins UI in Default Content field?

-
Ahmed
Reply all
Reply to author
Forward
0 new messages