Je dois vérifier la couverture minimale avec la nouvelle tâche jacoco
jacocoTestCoverageVerification
Cette tâche est disponible avec dans la version 3.4.1 gradle et avec le plugin jacoco> = 0.6.3
Je pourrais exécuter une autre tâche qui génère un rapport html avec la couverture de la branche, mais maintenant je veux utiliser ce numéro pour faire échouer la construction.
C'est mon code
buildscript {
ext {
....
}
repositories {
mavenCentral()
maven {
....
}
}
dependencies {
.....
}
}
apply plugin: 'Java'
apply plugin: 'Eclipse'
apply plugin: 'idea'
apply plugin: 'jacoco'
jar {
baseName = "coverage-test"
}
dependencies {
// my dependencies
}
Eclipse {
classpath {
containers.remove('org.Eclipse.jdt.launching.JRE_CONTAINER')
containers 'org.Eclipse.jdt.launching.JRE_CONTAINER/org.Eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8'
}
}
wrapper {
gradleVersion = '3.4.1'
}
jacoco {
toolVersion = '0.7.9'
}
jacocoTestReport {
reports {
xml.enabled false
csv.enabled false
}
group = "Reporting"
description = "Generate Jacoco coverage reports after running tests."
additionalSourceDirs = files(sourceSets.main.allJava.srcDirs)
afterEvaluate {
classDirectories = files(classDirectories.files.collect {
fileTree(
dir: it,
excludes:
[
'com/jacoco/dto/**',
'com/jacoco/configs/**',
//and others
])
})
}
}
jacocoTestCoverageVerification {
//I tried this and it didn't work
// classDirectories = files(classDirectories.files.collect {
// fileTree(
// dir: it,
// excludes:
// [
// 'com/jacoco/dto/**',
// 'com/jacoco/configs/**',
// //and others
// ])
// })
violationRules {
rule {
//Also tried this and it didn't work
// excludes = ['com/jacoco/dto/**', ...]
limit {
counter = 'BRANCH'
minimum = 0.8
}
}
}
}
check.dependsOn jacocoTestCoverageVerification
Avec classDirectories j'obtiens l'erreur suivante Impossible d'obtenir la propriété 'files' sur un objet nul . Et avec la deuxième option (seulement exclut), la construction se déroule sans à-coup mais elle n'exclut aucune classe.
Vous mesurez une chose différente que vous excluez. La portée par défaut de JaCoCo est "BUNDLE" qui, je crois, signifie tout le code. Je n'ai jamais utilisé ça. Je mesure toujours uniquement la portée "CLASS". Et on dirait que vous essayez de faire de même.
Les exclus sont relatifs aux éléments de la portée. Je ne sais pas ce que cela signifie pour "BUNDLE", mais je suis presque enclin à penser que c'est tout ou rien. Les exclus utilisent également différents types de caractères génériques. Essayez de changer votre configuration pour utiliser l'élément "CLASS" (ou "PACKAGE").
violationRules {
rule {
element = 'CLASS'
excludes = ['com.jacoco.dto.*']
limit {
counter = 'BRANCH'
minimum = 0.8
}
}
}
check.dependsOn jacocoTestCoverageVerification
Dans mon cas, j'ai voulu utiliser le [~ # ~] bundle [~ # ~] scope à définir un seuil pour l'ensemble tout en excluant certains packages et fichiers .
Ce qui a fonctionné pour moi à la fin a été d'ajouter l'exclusion de classDirectories
, comme suggéré dans la question d'origine, mais à l'intérieur de afterEvaluate
comme ceci:
afterEvaluate {
classDirectories = files(classDirectories.files.collect {
fileTree(dir: it, exclude: [
'com/example/my/package/*',
'com/example/service/MyApplication.class',
'com/google/protobuf/*'
])
})
}
Pour référence, le build.gradle
Complet ressemble à ceci:
apply plugin: "jacoco”
jacocoTestCoverageVerification {
afterEvaluate {
classDirectories = files(classDirectories.files.collect {
fileTree(dir: it, exclude: [
'com/example/my/package/*',
'com/example/service/MyApplication.class',
'com/google/protobuf/*'
])
})
}
violationRules {
rule {
limit {
minimum = 0.79
}
}
}
}
// to run coverage verification during the build (and fail when appropriate)
check.dependsOn jacocoTestCoverageVerification
Vous pouvez trouver plus de détails dans mon blog: http://jivimberg.io/blog/2018/04/26/gradle-verify-coverage-with-exclusions/