blob: 8bf327039df10fe69a4028260a6559d6d588964d [file] [log] [blame]
<?xml version="1.0"?>
<!--
/*
* Copyright 2001-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-->
<jsl:stylesheet
select="$doc"
xmlns:j="jelly:core"
xmlns:jsl="jelly:jsl"
xmlns:x="jelly:xml"
xmlns:define="jelly:define"
xmlns:util="jelly:util"
xmlns:junit="junit"
xmlns:doc="doc"
trim="false">
<j:useBean var="stringTool" class="org.apache.maven.util.StringTool"/>
<define:taglib uri="junit">
<define:tag name="nav">
<p>
[<a href="#Summary">summary</a>]
[<a href="#Package List">package list</a>]
[<a href="#Test Cases">test cases</a>]
</p>
</define:tag>
<define:tag name="testSuiteHeader">
<tr>
<th>Name</th>
<th>Tests</th>
<th>Errors</th>
<th>Failures</th>
<th>Time(s)</th>
</tr>
</define:tag>
<define:tag name="testCaseHeader">
<tr>
<th>Name</th>
<th>Status</th>
<th>Type</th>
<th>Time(s)</th>
</tr>
</define:tag>
<define:tag name="displayFailure">
<j:choose>
<j:when test="${current.attribute('message') != null}">
<code>
${current.attributeValue('message')}
</code>
</j:when>
<j:otherwise>
N/A
</j:otherwise>
</j:choose>
</define:tag>
<!-- defined here to easily change images globally or set up relative paths -->
<define:tag name="displayImage">
<j:choose>
<j:when test="${kind == 'failure'}">
<img src="images/icon_warning_sml.gif" width="15" height="15" alt="Failure" />
</j:when>
<j:when test="${kind == 'error'}">
<img src="images/icon_error_sml.gif" width="15" height="15" alt="Error" />
</j:when>
<j:when test="${kind == 'success'}">
<img src="images/icon_success_sml.gif" width="15" height="15" alt="Success" />
</j:when>
</j:choose>
</define:tag>
</define:taglib>
<jsl:template match="testsuites">
<document>
<properties>
<title>JUnit Test Results</title>
</properties>
<body>
<section name="Summary">
<junit:nav/>
<j:set var="testCount"><x:expr select="sum(testsuite/@tests)"/></j:set>
<j:set var="errorCount"><x:expr select="sum(testsuite/@errors)"/></j:set>
<j:set var="failureCount"><x:expr select="sum(testsuite/@failures)"/></j:set>
<j:set var="timeCount"><x:expr select="sum(testsuite/@time)"/></j:set>
<j:set var="successRate"><x:expr select="($testCount - ($failureCount + $errorCount)) div $testCount"/></j:set>
<table summary="JUnit result summary">
<thead>
<tr>
<th>Tests</th>
<th>Errors</th>
<th>Failures</th>
<th>Success rate</th>
<th>Time(s)</th>
</tr>
</thead>
<tr>
<td>
<doc:formatAsNumber string="${testCount}" pattern="0"/>
</td>
<td>
<doc:formatAsNumber string="${errorCount}" pattern="0"/>
</td>
<td>
<doc:formatAsNumber string="${failureCount}" pattern="0"/>
</td>
<td>
<doc:formatAsNumber string="${successRate}" pattern="0.00%"/>
</td>
<td>
<doc:formatAsNumber string="${timeCount}" pattern="0.00"/>
</td>
</tr>
</table>
<p>
Note:
<i>failures</i> are anticipated and checked for with
assertions while
<i>errors</i> are unanticipated.
</p>
<p>
<h3><a href="../testng-output/index.html">TestNG Default Report</a></h3>Click [ <a href="../testng-output/index.html">here</a> ] to see the default report output.
</p>
</section>
<section name="Package List">
<junit:nav/>
<table summary="Package List">
<thead>
<tr>
<th>Package</th><th>Tests</th><th>Errors</th><th>Failures</th><th>Success Rate</th><th>Time</th>
</tr>
</thead>
<x:set var="testsuites" select="./testsuite[not(./@package = preceding-sibling::testsuite/@package)]"/>
<j:forEach var="testsuite" items="${testsuites}">
<j:set var="package" value="${testsuite.attribute('package').value}"/>
<x:set var="quotedPackage" select='"${package}"'/>
<j:set var="testCount"><x:expr select="sum(./testsuite[./@package = $quotedPackage]/@tests)"/></j:set>
<j:set var="errorCount"><x:expr select="sum(./testsuite[./@package = $quotedPackage]/@errors)"/></j:set>
<j:set var="failureCount"><x:expr select="sum(./testsuite[./@package = $quotedPackage]/@failures)"/></j:set>
<j:set var="timeCount"><x:expr select="sum(./testsuite[./@package = $quotedPackage]/@time)"/></j:set>
<j:set var="successRate"><x:expr select="($testCount - ($failureCount + $errorCount)) div $testCount"/></j:set>
<tr>
<td>
<a href="#${package}">${package}</a>
</td>
<td>
<doc:formatAsNumber string="${testCount}" pattern="0"/>
</td>
<td>
<doc:formatAsNumber string="${errorCount}" pattern="0"/>
</td>
<td>
<doc:formatAsNumber string="${failureCount}" pattern="0"/>
</td>
<td>
<doc:formatAsNumber string="${successRate}" pattern="0.00%"/>
</td>
<td>
<doc:formatAsNumber string="${timeCount}" pattern="0.00"/>
</td>
</tr>
</j:forEach>
</table>
<p>
Note: package statistics are not computed recursively, they only
sum up all of its testsuites numbers.
</p>
<j:forEach var="testsuite" items="${testsuites}">
<j:set var="package" value="${testsuite.attribute('package').value}"/>
<x:set var="quotedPackage" select='"${package}"'/>
<a name="${package}"></a>
<subsection name="${package}">
<table summary="Tests for ${package}">
<thead>
<tr>
<th colspan="2">TestNG Test Name</th><th>Tests</th><th>Errors</th><th>Failures</th><th>Success Rate</th><th>Time</th>
</tr>
</thead>
<x:forEach var="test" select="/testsuites/testsuite[./@package = $quotedPackage]">
<j:set var="testCount"><x:expr select="${test.attribute('tests').value}" /></j:set>
<j:set var="errorCount"><x:expr select="${test.attribute('errors').value}" /></j:set>
<j:set var="failureCount"><x:expr select="${test.attribute('failures').value}" /></j:set>
<j:set var="successRate"><x:expr select="($testCount - ($failureCount + $errorCount)) div $testCount"/></j:set>
<tr>
<td>
<j:choose>
<j:when test="${errorCount != 0}">
<junit:displayImage kind="error" />
</j:when>
<j:when test="${failureCount != 0}">
<junit:displayImage kind="failure" />
</j:when>
<j:otherwise>
<junit:displayImage kind="success" />
</j:otherwise>
</j:choose>
</td>
<td>
<a href="#${test.attribute('name').value}">${test.attribute('name').value}</a>
</td>
<td>
<doc:formatAsNumber string="${testCount}" pattern="0"/>
</td>
<td>
<doc:formatAsNumber string="${errorCount}" pattern="0"/>
</td>
<td>
<doc:formatAsNumber string="${failureCount}" pattern="0"/>
</td>
<td>
<doc:formatAsNumber string="${successRate}" pattern="0.00%"/>
</td>
<td>
<doc:formatAsNumber string="${test.attribute('time').value}" pattern="0.000"/>
</td>
</tr>
</x:forEach>
</table>
</subsection>
</j:forEach>
</section>
<section name="Test Cases">
<junit:nav/>
<x:set var="testsuites" select="./testsuite"/>
<j:forEach var="testsuite" items="${testsuites}">
<a name="${testsuite.attribute('name').value}"></a>
<subsection name="${testsuite.attribute('name').value}">
<table summary="Testsuite: ${testsuite.attribute('name').value}">
<x:set var="errors" select="$testsuite/error"/>
<j:forEach var="error" items="${errors}">
<tr>
<td colspan="4">
<junit:displayFailure current="${error}"/>
</td>
</tr>
</j:forEach>
<x:set var="testcases" select="$testsuite/testcase"/>
<j:forEach var="testcase" items="${testcases}">
<j:set var="failure" value="${testcase.selectSingleNode('failure')}"/>
<j:set var="error" value="${testcase.selectSingleNode('error')}"/>
<j:set var="testname" value="${testcase.attribute('name').value}"/>
<tr>
<td style="width:20px">
<j:choose>
<j:when test="${failure != null}">
<a href="#${testname}"><junit:displayImage kind="failure" /></a>
</j:when>
<j:when test="${error != null}">
<a href="#${testname}"><junit:displayImage kind="error" /></a>
</j:when>
<j:otherwise>
<junit:displayImage kind="success" />
</j:otherwise>
</j:choose>
</td>
<td style="width:98%">[${testcase.attribute("classname").value}]${testcase.attribute("name").value}</td>
<td style="width:60px">
<j:if test="${testcase.attribute('time') != null}">
<doc:formatAsNumber string="${testcase.attribute('time').value}" pattern="0.00"/>
</j:if>
</td>
</tr>
<j:choose>
<j:when test="${failure != null}">
<tr>
<td colspan="3" style="padding-left: 20px">
<junit:displayFailure current="${failure}"/>
</td>
</tr>
</j:when>
<j:when test="${error != null}">
<tr>
<td colspan="3" style="padding-left: 20px">
<junit:displayFailure current="${error}"/>
</td>
</tr>
</j:when>
</j:choose>
</j:forEach>
</table>
</subsection>
</j:forEach>
</section>
<x:set var="errorCheck" select="/testsuites/testsuite/testcase/*" />
<j:if test="${!empty(errorCheck)}">
<section name="Failure details">
<x:forEach var="testcase" select="/testsuites/testsuite/testcase" trim="false">
<j:set var="failure" value="${testcase.selectSingleNode('failure')}"/>
<j:set var="error" value="${testcase.selectSingleNode('error')}"/>
<j:if test="${empty(failure)}">
<j:set var="failure" value="${error}"/>
</j:if>
<j:if test="${!empty(failure)}">
<j:set var="testname" value="${testcase.attribute('classname').value}.${testcase.attribute('name').value}()"/>
<table summary="Failure details for ${testname}">
<thead>
<tr>
<td style="width:20px">
<j:choose>
<j:when test="${!empty(error)}">
<junit:displayImage kind="error" />
</j:when>
<j:otherwise>
<junit:displayImage kind="failure"/>
</j:otherwise>
</j:choose>
</td>
<td style="width:96%"><strong><a name="${testname}">${testname}</a></strong></td>
</tr>
</thead>
<tbody>
<tr>
<td colspan="2"><junit:displayFailure current="${failure}"/></td>
</tr>
<tr>
<td colspan="2">
<!-- removing stacktrace generated by maven -->
<!-- no way to preserve newlines, jelly strips out everything -->
<code>
${stringTool.splitStringAtLastDelim(stringTool.splitStringAtLastDelim(failure.text, 'at org.apache.commons.jelly.tags.ant.AntTag.doTag').get(0),
'at sun.reflect.NativeMethodAccessorImpl.invoke0(').get(0)}
</code>
</td>
</tr>
</tbody>
</table>
</j:if>
</x:forEach>
</section>
</j:if>
</body>
</document>
</jsl:template>
</jsl:stylesheet>