How to create an HTML report for JUnit 5 tests?

Juergen Zimmermann picture Juergen Zimmermann · Sep 12, 2016 · Viewed 12k times · Source

Is there already a possibility to generate an HTML report when JUnit tests were started via Gradle? Any hint or comment is appreciated.

Answer

Sam Brannen picture Sam Brannen · Sep 12, 2016

UPDATE

Gradle 4.6 provides built-in support for the JUnit Platform which allows you to run JUnit Jupiter tests using the standard Gradle test task which generates HTML reports out of the box.


Answer for Gradle versions prior to 4.6

The JUnit Platform Gradle Plugin generates JUnit 4 style XML test reports.

These XML files are output to build/test-results/junit-platform by default.

So, if your build server knows how to parse JUnit 4 style XML reports, you can just point it to the XML files in that directory and let the build server generate the HTML report for you.

However, if you are asking if Gradle can generate an HTML report for your tests run via the junitPlatformTest task, then the answer is "No, unfortunately not." The reason is that the standard Gradle test task only generates HTML reports based on its own proprietary "binary" report format. Since the junitPlatformTest task does not generate reports in Gradle's binary format, Gradle itself cannot generate HTML reports for JUnit Platform tests.

Having said that, however, there is in fact a work around: you can use Ant within your Gradle build. Ant has a task for aggregating JUnit 4 based XML reports and generating an HTML report from those aggregated reports. The output is not very modern, but it is at least human readable. The downside is that the default XSLT stylesheet does not display the test class names for tests run via the JUnit Platform.

In any case, you can configure Ant's JUnitReport task in Gradle as follows.

junitPlatform {
    // configure as normal
}

configurations {
    junitXmlToHtml
}

task generateHtmlTestReports << {
    def reportsDir = new File(buildDir, 'test-reports')
    reportsDir.mkdirs()

    ant.taskdef(
        name: 'junitReport',
        classname: 'org.apache.tools.ant.taskdefs.optional.junit.XMLResultAggregator',
        classpath: configurations.junitXmlToHtml.asPath
    )

    ant.junitReport(todir: "$buildDir/test-results/junit-platform", tofile: "aggregated-test-results.xml") {
        fileset(dir: "$buildDir/test-results/junit-platform")
        report(format: 'frames', todir: reportsDir)
    }
}

afterEvaluate {
    def junitPlatformTestTask = tasks.getByName('junitPlatformTest')
    generateHtmlTestReports.dependsOn(junitPlatformTestTask)
    check.dependsOn(generateHtmlTestReports)
}

dependencies {
    // configure as normal ...

    junitXmlToHtml 'org.apache.ant:ant-junit:1.9.7'
}

Then, executing gradle check will generate an HTML report in build/test-reports/index.html.

Regards,

Sam (Core JUnit 5 committer)