web-dev-qa-db-fra.com

Filtrer les rapports de couverture JaCoCo avec Gradle

Problème:

J'ai un projet avec jacoco et je veux pouvoir filtrer certaines classes et/ou packages.

Documentation connexe:

J'ai lu la documentation suivante:

Officiel jacoco site: http://www.eclemma.org/jacoco/index.html =

Officiel jacoco docs pour gradle : https://gradle.org/ docs/current/userguide/jacoco_plugin.html

Officiel jacocoGithub numéros, travaillant sur la couverture: https://github.com/jacoco/jacoco/wiki/FilteringOptionshttps://github.com/jacoco/jacoco/issues/14

Liens StackOverflow associés:

JaCoCo & Gradle - Options de filtrage (Pas de réponse)

Exclure les paquets du rapport Jacoco en utilisant Sonarrunner et Gradle (Ne pas utiliser sonar )

JaCoCo - exclut JSP du rapport (Il semble fonctionner pour maven , j'utilise gradle )

Configuration Maven Jacoco - Exclure les classes/packages du rapport ne fonctionnant pas (Il semble fonctionner pour maven , j'utilise gradle )

exclu du plugin JaCoCo gradle (Impossible que cela fonctionne)

Gradle Jacoco - les rapports de couverture incluent les classes exclues de la configuration (semble très proche, il utilisait doFirst, ne fonctionnait pas pour moi)

Exemple de ce que j'ai essayé:

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"]
        }
    }
}

Question:

Comment puis-je exclure certains packages et classes lors de la génération des rapports de couverture jacoco ?

80
Jared Burrows

Grâce à, Yannick Welsch:

Après recherche sur Google, lecture des documents Gradle et consultation des anciens messages de StackOverflow, j'ai trouvé cette réponse sur les forums de officiels gradle !

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

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

Solution à mon build.gradle pour les projets 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/**'])
        })
    }
}

Comme vous pouvez le constater, j’ai pu ajouter plus de choses à exclude: afin de filtrer quelques paquets.

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

Tâches personnalisées pour d'autres projets tels qu'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/**'])
        })
    }
}

Source: https://github.com/jaredsburrows/Android-gradle-Java-app-template/blob/master/gradle/ quality.gradle # L59

86
Jared Burrows

Pour Gradle version 5.0 et ultérieure, la classDirectories = files(...) donne un avertissement concernant la désapprobation. C'est la manière non obsolète d'exclure des classes:

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

pour moi, c'est bien de travailler avec

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

comme indiqué dans la documentation https://docs.gradle.org/current/userguide/jacoco_plugin.html#N16E62 et initialement demandé, la réponse est:

donc si vous me demandez: ce n'est pas une question de

excludes = ["projecteuler/**"]

ou

excludes += ["projecteuler/**"]

mais

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

exclure un paquet *.projecteuler.*

et test {} au niveau du projet, non imbriqué dans jacocoTestReport

10
childno͡.de

Ici est une solution à ce problème dans ANT. Ceci peut être adapté en ajoutant le suivant sous la tâche jacocoTestReport. Bien que cela ne soit pas vraiment documenté par jacoco, cela semble être le seul moyen de filtrer les résultats des tests pour le moment.

afterEvaluate {
    classDirectories = files(classDirectories.files.collect {
        fileTree(dir: it, exclude: 'excluded/files/**')
    })
}
6
Andre Compagno

Cela fait longtemps que je ne le vois pas, mais je viens de le découvrir. Je me débattais avec toutes les exclusions nécessaires. J'ai trouvé que c'était quelque chose de beaucoup plus simple pour moi. Si vous suivez les styles de présentation de projet Maven/src/main/Java et/src/test/Java, il vous suffit de saisir buildDir/classes/ main dans votre classDirectories config comme suit:

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
Randy

Le code ci-dessous exclut également les classes de la vérification de la couverture:

jacocoTestCoverageVerification {
    afterEvaluate {
        classDirectories = files(classDirectories.files.collect {
            fileTree(dir: "${project.buildDir}/classes/main",
                    exclude: ['**/packagename/**'])
        })
    }
}
3
er-han