6

I'm moving my build from Ant to Gradle. Ant allows multiple reports with different formats to be created by the JUnit task. Gradle is more restrictive-- it generates a HTML report and a XML report. The XML report is a superset of the JUnit text report so it can be transformed from one to the other. What XSLT will convert the XML to the Text? Here is an example XML:

<?xml version="1.0" encoding="UTF-8"?>
<testsuite errors="0" failures="0" hostname="spina.stsci.edu" name="edu.stsci.CoSI.test.DependencySupressingConstraintJUnitTest" tests="6" time="0.14" timestamp="2012-02-27T18:08:03">
  <properties />
  <testcase classname="edu.stsci.CoSI.test.DependencySupressingConstraintJUnitTest" name="testSupressionWorks" time="0.01" />
  <testcase classname="edu.stsci.CoSI.test.DependencySupressingConstraintJUnitTest" name="testSupressionWorksWithDependenciesDisabled" time="0.0020" />
  <testcase classname="edu.stsci.CoSI.test.DependencySupressingConstraintJUnitTest" name="testPropagationIsDeferred" time="0.0010" />
  <testcase classname="edu.stsci.CoSI.test.DependencySupressingConstraintJUnitTest" name="testPropagationIsDeferredWhenDependenciesAreSuppressed" time="0.0010" />
  <testcase classname="edu.stsci.CoSI.test.DependencySupressingConstraintJUnitTest" name="testPropagationIsDeferredWhenDependenciesAreSuppressed2" time="0.0010" />
  <testcase classname="edu.stsci.CoSI.test.DependencySupressingConstraintJUnitTest" name="testGarbageCollection" time="0.066" />
  <system-out><![CDATA[Running Supressing Constraint
    Running Supressing Constraint
    Running Supressing Constraint
    Change Me is: 2
    Running Supressing Constraint
    Change Me is: 5
    ]]></system-out>
  <system-err><![CDATA[]]></system-err>
</testsuite>

Here is the text that I would like it to produce:

Testsuite: edu.stsci.CoSI.test.DependencySupressingConstraintJUnitTest
Tests run: 6, Failures: 0, Errors: 0, Time elapsed: 0.363 sec
------------- Standard Output ---------------
Running Supressing Constraint
Running Supressing Constraint
Running Supressing Constraint
Change Me is: 2
Running Supressing Constraint
Change Me is: 5
------------- ---------------- ---------------

Testcase: testSupressionWorks took 0.001 sec
Testcase: testSupressionWorksWithDependenciesDisabled took 0.001 sec
Testcase: testPropagationIsDeferred took 0 sec
Testcase: testPropagationIsDeferredWhenDependenciesAreSuppressed took 0.001 sec
Testcase: testPropagationIsDeferredWhenDependenciesAreSuppressed2 took 0 sec
Testcase: testGarbageCollection took 0.038 sec

Certain details aren't important (like the format of the seconds).

Spina
  • 8,986
  • 7
  • 37
  • 36
  • So, what is the question? I don't see one. – Dimitre Novatchev Feb 27 '12 at 18:33
  • @DimitreNovatchev, thanks for pointing out my omission. I took my lead on this question from here: http://stackoverflow.com/questions/3671613/junit-report-single-page-xslt-for-email . If it really is an inappropriate question I'm happy to withdraw it. I thought it might be of general use because it has to do with migrating from one build system to another. – Spina Feb 27 '12 at 19:30
  • Spina, it isn't inappropriate -- just it seems that you want someone to do *the whole work for you* -- not that you have tried yourself, written a transformation and have a problem with it. People here are willing to *help* in doing the work, but not to do the whole work. What is more important is that you learn something as result. When people do the entire work for you, chances of you learning/understanding are minimal. – Dimitre Novatchev Feb 27 '12 at 20:41

1 Answers1

17

Here ya go.

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" indent="no"/>

  <xsl:template match="/testsuite">
    Testsuite: <xsl:value-of select="@name" />
    <xsl:text>
    Tests run: </xsl:text>
    <xsl:value-of select="@tests" />
    <xsl:text>, Failures: </xsl:text>
    <xsl:value-of select="@failures" />
    <xsl:text>, Errors: </xsl:text>
    <xsl:value-of select="@errors" />
    <xsl:text>, Time elapsed: </xsl:text>
    <xsl:value-of select="@time" />
    <xsl:text> sec</xsl:text>
    <xsl:apply-templates select="system-out" />
    <xsl:apply-templates select="system-err" />
    <xsl:text>
    --------- ----------- ---------
    </xsl:text>
    <xsl:apply-templates select="testcase" />
  </xsl:template>

  <xsl:template match="testcase">
    <xsl:text>
    Testcase: </xsl:text>
    <xsl:value-of select="@name" />
    <xsl:text> took </xsl:text>
    <xsl:value-of select="@time" />
  </xsl:template>

  <xsl:template match="system-out">
    <xsl:text>
    ------ Standard output ------
    </xsl:text>
    <xsl:value-of select="." />
  </xsl:template>

  <xsl:template match="system-err">
    <xsl:text>
    ------ Error output ------
    </xsl:text>
    <xsl:value-of select="." />
  </xsl:template>

</xsl:stylesheet>

You probably want to play a bit with the formatting though.

dvdvorle
  • 941
  • 1
  • 10
  • 25
  • 1
    Thanks @Mr Happy. That does exactly what I wanted (with some tweaks). – Spina Apr 06 '12 at 14:19
  • Thanks. I used this for outputting test errors in a gradle build as plain text to the Travis CI console: https://github.com/lhotari/travis-gradle-test-failures-to-console/blob/master/travis/junit-xml-format-errors.xsl – Lari Hotari Nov 29 '14 at 08:54