web-dev-qa-db-fra.com

Comment puis-je vérifier la couverture minimale avec certaines classes exclues et avec le plugin jacoco?

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.

17
Juan Pressacco

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
11
MartinTeeVarga

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/

11
jivimberg