Filtrar informes de cobertura de JaCoCo con Gradle


Problema:

Tengo un proyecto con jacoco y quiero poder filtrar ciertas clases y/o paquetes.

Documentación relacionada:

He leído la siguiente documentación:

Sitio oficial de jacoco : {[17]]} http://www.eclemma.org/jacoco/index.html

Oficial jacoco docs para gradle: https://gradle.org/docs/current/userguide/jacoco_plugin.html

Oficial jacoco Github cuestiones, trabajando en la cobertura: https://github.com/jacoco/jacoco/wiki/FilteringOptions https://github.com/jacoco/jacoco/issues/14

Enlaces relacionados con StackOverflow:

JaCoCo & Gradle-Opciones de filtrado (Sin respuesta)

Excluir paquetes del informe Jacoco usando Sonarrunner y Gradle (No usando sonar )

JaCoCo-excluir JSP del informe (Parece funcionar para maven, estoy usando gradle )

Maven Jacoco Configuration-Excluir clases / paquetes del informe no funciona (Parece funcionar para maven, estoy usando gradle )

JaCoCo gradle plugin exclude (No se pudo hacer que esto funcione)

Gradle Jacoco-los informes de cobertura incluyen clases excluidas en la configuración (Parece muy cerca, se utiliza doFirst, no funcionó para mí)

Ejemplo de lo que he intentado:

apply plugin: 'java'
apply plugin: 'jacoco'

buildscript {
    repositories {
        mavenCentral()
        jcenter()
    }
}

repositories {
    jcenter()
}

jacocoTestReport {
    reports {
        xml {
            enabled true // coveralls plugin depends on xml format report
        }

        html {
            enabled true
        }
    }

    test {
        jacoco {
            destinationFile = file("$buildDir/jacoco/jacocoTest.exec")
            classDumpFile = file("$buildDir/jacoco/classpathdumps")
            excludes = ["projecteuler/**"] // <-- does not work
            // excludes = ["projecteuler"]
        }
    }
}

Pregunta:

¿Cómo puedo excluir ciertos paquetes y clases al generar los informes de cobertura jacoco?

Author: Community, 2015-04-27

5 answers

Gracias a, Yannick Welsch:

Después de buscar en Google, leer los documentos de Gradle y revisar publicaciones más antiguas de StackOverflow, encontré esta respuesta en los foros Oficiales de gradle.

jacocoTestReport {
    afterEvaluate {
        classDirectories = files(classDirectories.files.collect {
            fileTree(dir: it, exclude: 'com/blah/**')
        })
    }
}

Fuente: https://issues.gradle.org/browse/GRADLE-2955

Solución a mis build.gradle para proyectos Java / Groovy:

apply plugin: 'java'
apply plugin: 'jacoco'

jacocoTestReport {
    reports {
        xml {
            enabled true // coveralls plugin depends on xml format report
        }

        html {
            enabled true
        }
    }

    afterEvaluate {
        classDirectories = files(classDirectories.files.collect {
            fileTree(dir: it,
                    exclude: ['codeeval/**',
                              'crackingthecode/part3knowledgebased/**',
                              '**/Chapter7ObjectOrientedDesign**',
                              '**/Chapter11Testing**',
                              '**/Chapter12SystemDesignAndMemoryLimits**',
                              'projecteuler/**'])
        })
    }
}

Como puede ver, pude agregar más a exclude: con el fin de filtrar algunos paquetes.

Fuente: https://github.com/jaredsburrows/CS-Interview-Questions/blob/master/build.gradle

Tareas personalizadas para otros proyectos como Android:

apply plugin: 'jacoco'

task jacocoReport(type: JacocoReport) {
    reports {
        xml {
            enabled true // coveralls plugin depends on xml format report
        }

        html {
            enabled true
        }
    }

    afterEvaluate {
        classDirectories = files(classDirectories.files.collect {
            fileTree(dir: it,
                    exclude: ['codeeval/**',
                              'crackingthecode/part3knowledgebased/**',
                              '**/Chapter7ObjectOrientedDesign**',
                              '**/Chapter11Testing**',
                              '**/Chapter12SystemDesignAndMemoryLimits**',
                              'projecteuler/**'])
        })
    }
}

Fuente: https://github.com/jaredsburrows/android-gradle-java-app-template/blob/master/gradle/quality.gradle#L59

 68
Author: Jared Burrows,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-23 14:07:50

Para mí, está bien trabajar con

test {
  jacoco {
    excludes += ['codeeval/**',
                 'crackingthecode/part3knowledgebased/**',
                 '**/Chapter7ObjectOrientedDesign**',
                 '**/Chapter11Testing**',
                 '**/Chapter12SystemDesignAndMemoryLimits**',
                 'projecteuler/**']
  }
}

Como se indica en la documentación https://docs.gradle.org/current/userguide/jacoco_plugin.html#N16E62 e initally preguntó así que la respuesta es:

Así que si me preguntas: no es una cuestión de{[8]]}

excludes = ["projecteuler/**"]

O

excludes += ["projecteuler/**"]

Pero

excludes = ["**/projecteuler/**"]

Para excluir un paquete *.projecteuler.*

Y test {} a nivel de proyecto, no anidado en jacocoTestReport

 8
Author: childno͡.de,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-21 10:37:31

Aquí es una solución para este problema en ANT. Esto se puede adaptar a gradle agregando lo siguiente en la tarea jacocoTestReport. Aunque esto no está realmente documentado por jacoco, parece ser la única manera de filtrar los resultados de las pruebas por ahora.

afterEvaluate {
    classDirectories = files(classDirectories.files.collect {
        fileTree(dir: it, exclude: 'excluded/files/**')
    })
}
 4
Author: Andre Compagno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:09:58

Esto ha estado fuera por un tiempo, pero acabo de encontrarme con esto. Estaba luchando con todas las exclusiones necesarias. Descubrí que era algo mucho más simple para mí. Si sigue el estilo de diseño del proyecto Maven / src/main / java y/src / test / java, simplemente necesita poner buildDir/classes / main en sus classDirectories config así:

afterEvaluate {
    jacocoTestReport {
        def coverageSourceDirs = ['src/main/java']
        reports {
            xml.enabled false
            csv.enabled false
            html.destination "${buildDir}/reports/jacocoHtml"
        }
        sourceDirectories = files(coverageSourceDirs)
        classDirectories = fileTree(
                dir: "${project.buildDir}/classes/main",
                excludes: [
                      //whatever here like JavaConfig etc. in /src/main/java
                     ]
        )
    }
}
 4
Author: Randy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-02 00:16:45

El siguiente código también excluye las clases de la verificación de cobertura:

jacocoTestCoverageVerification {
    afterEvaluate {
        classDirectories = files(classDirectories.files.collect {
            fileTree(dir: "${project.buildDir}/classes/main",
                    exclude: ['**/packagename/**'])
        })
    }
}
 1
Author: er-han,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-30 12:54:29