Gradle code coverage report


#1

Greetings all,

I’ve just hacked together a little gradle task to modify the standard jacoco coverage output to make it a bit more Kotlin friendly.

The default output navigates by class which isn’t very friendly as Kotlin generates numerous anonymous and function classes.

This hack provides a file-based view instead by merging the jacoco source index files into a combined index.

Anyway, I thought it might be useful to others.

To use, add the following to your gradle project:

apply plugin: 'jacoco'
 
 
 
task coverage(dependsOn: 'jacocoTestReport') << {
    def reports = new File(project.buildDir, '/reports/jacoco/test/html')
    def index = new File(reports, 'index.html').getText('UTF-8')
    def footer = '<div class="footer">'
    def result = new StringBuilder(index.substring(0, index.indexOf(footer)))
 
    reports.eachDirMatch({ !new File(it).name.startsWith(".") }) { dir ->
        def moduleIndex = new File(dir, 'index.source.html')
        def content = moduleIndex.getText('UTF-8')
                .replaceAll('\\.\\./\\.resources', '.resources')
                .replaceAll('href="', "href=\"${dir.name}/")
        result.append(content.substring(content.indexOf('<h1>'), content.indexOf(footer)))
    }
    result.append(index.substring(index.indexOf(footer)))
 
    def output = new File(reports, 'index.source.html')
 
    output.delete()
    output << result.toString()
    println("open $output.path")
}
 

This will generate a combined index for your module. e.g.

You can then directly navigate to the Kotlin source:

Cheers,
Andrew