Filtra i rapporti sulla copertura JaCoCo con Gradle


113

Problema:

Ho un progetto con e voglio essere in grado di filtrare determinate classi e / o pacchetti.

Documentazione correlata:

Ho letto la seguente documentazione:

Ufficiale sito: http://www.eclemma.org/jacoco/index.html

Ufficiale documenti per : https://gradle.org/docs/current/userguide/jacoco_plugin.html

Ufficiale Githubproblemi, lavorando sulla copertura: https://github.com/jacoco/jacoco/wiki/FilteringOptions https://github.com/jacoco/jacoco/issues/14

Link StackOverflow correlati:

JaCoCo & Gradle - Opzioni di filtro (Nessuna risposta)

Escludere i pacchetti dal report Jacoco utilizzando Sonarrunner e Gradle (non utilizzando)

JaCoCo - esclude JSP dal rapporto (sembra funzionare per, Sto usando )

Configurazione di Maven Jacoco - Esclude classi / pacchetti dal report che non funziona (sembra funzionare per, Sto usando )

JaCoCo gradle plugin exclude (Impossibile farlo funzionare)

Gradle Jacoco - i rapporti di copertura includono le classi escluse nella configurazione (sembra molto vicino, ha usato doFirst, non ha funzionato per me)

Esempio di quello che ho provato:

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

Domanda:

Come posso escludere determinati pacchetti e classi durante la generazione del file rapporti di copertura?


Un'opzione di terze parti (FD sono il fondatore di): se carichi i rapporti su Codecov puoi ignorare tutti i file che ti piacciono dopo il fatto nella sezione delle caratteristiche del prodotto. Grazie.
Steve Peak

@StevePeak Quindi puoi filtrare packagesonline usando Codecov? Inoltre, ho visto il Github, che dire del Androidsupporto, ho visto Java. Dovrei comunque inviarti tutti i rapporti, quindi filtrare dopo e filtrare prima.
Jared Burrows

Puoi filtrare in base a un metodo regexp di qualsiasi file che non desideri includere. Tutto il Java è supportato tramite i rapporti Jacoco. Basta filtrare dopo il fatto su Codecov funziona. Ricorderà i tuoi filtri e li applicherà a tutti i rapporti futuri. Grazie!
Steve Peak

6
Sono curioso; Che cosa significa il excludesdalla documentazione ufficiale in realtà fare allora? È praticamente inutile?
Vivin Paliath

Non si excludestratta dell'attività di copertura, ma dell'attività di prova. Esclude la strumentazione dei file da JaCoCo e quindi la registrazione della copertura. Puoi usarlo se non vuoi registrare la copertura per alcune classi, se non puoi a causa di qualche conflitto con un altro agente di strumentazione o perché hai pre-strumentato le classi. Ciò non escluderà una classe dalla relazione, soprattutto nell'ultimo caso citato, questa sarebbe un'idea orribile.
Vampire

Risposte:


115

Grazie a Yannick Welsch:

Dopo aver cercato su Google, letto i documenti di Gradle e passato attraverso i vecchi post di StackOverflow, ho trovato questa risposta sull'Official forum!

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

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

Soluzione per i miei build.gradleprogetti 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/**'])
        })
    }
}

Come puoi vedere, sono riuscito ad aggiungerne altri exclude:per filtrare alcuni pacchetti.

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

Attività personalizzate per altri progetti come 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/**'])
        })
    }
}

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


1
@BradPitcher Nessun problema! Mi ci è voluto un po 'per trovare la risposta giusta. Sembra solo così "hacker". Spero che escano con un modo migliore.
Jared Burrows

Allora, qual è l'approccio corretto se voglio solo escludere una classe dal pacchetto?
Pedro Henrique

2
Qualcosa del tipo:exclude: ['**/*Test*.*'])
Jared Burrows

1
jacocoTestReportfunziona solo con entrambi jacocoe javaplugin. Questo non è per Android. Si prega di consultare il mio repository qui per Android: github.com/jaredsburrows/android-gradle-java-template/blob/…
Jared Burrows

9
I classDirectories =risultati in questo avviso. The JacocoReportBase.setClassDirectories(FileCollection) method has been deprecated. This is scheduled to be removed in Gradle 6.0. Use getClassDirectories().from(...). Sarebbe bello mostrare una soluzione compatibile con Gradle 6.0.
Thunderforge

61

Per Gradle versione 5.x, classDirectories = files(...)fornisce un avviso di deprecazione e non funziona affatto a partire da Gradle 6.0 Questo è il modo non specificato di escludere le classi:

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

2
O semplicemente usa classDirectories.from (da aggiungere all'elenco invece di sovrascrivere l'elenco)
Mohamed El-Beltagy

1
Aggiungerai []dopo exclude: per includere diversi percorsi.
WesternGun

Eccellente, uso gradle 6.0.1 e questa soluzione ha funzionato per me.
Dargenn

14

per me va bene lavorare con

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

come indicato nella documentazione https://docs.gradle.org/current/userguide/jacoco_plugin.html#N16E62 e inizialmente chiesto quindi la risposta è:

quindi se me lo chiedi: non è una questione di

excludes = ["projecteuler/**"]

o

excludes += ["projecteuler/**"]

ma

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

per escludere un pacchetto *.projecteuler.*

ea test {}livello di progetto, non annidato injacocoTestReport


1
Questo sembra dare alle classi una copertura dello 0% piuttosto che ometterle del tutto. Sto usando JaCoCi 0.8.5 e Gradle 6.0
tschumann

Questo è il modo giusto per dire a Jacoco di non intromettersi con alcune classi, altri approcci riguardano solo la parte di segnalazione.
Brice

9

Per Gradle6 Usa qualcosa come sotto, perché hanno creato classDirectories as final, non possiamo riassegnarlo, ma esiste un metodo setter classDirectories.setFromche può essere utilizzato

    jacocoTestReport {
    reports {
        xml.enabled true
        html.enabled true
        html.destination file("$buildDir/reports/jacoco")
    }

    afterEvaluate {
        classDirectories.setFrom(files(classDirectories.files.collect {
            fileTree(dir: it,
                    exclude: ['**/server/**',
                              '**/model/**',
                              '**/command/**'
                    ]
            )
        }))
    }
}

6

Ecco una soluzione per questo problema in ANT. Questo può essere adattato al gradle aggiungendo quanto segue sotto l' jacocoTestReportattività. Sebbene questo non sia realmente documentato da Jacoco, sembra l'unico modo per filtrare i risultati del test per ora.

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

Va bene, grazie per aver confermato che i miei risultati sono corretti! Spero che semplificheranno il filtraggio in futuro o semplicemente documenteranno come filtrare usando Gradle.
Jared Burrows

C'è un modo per escludere un set di sorgenti dall'inclusione nel rapporto Jacoco? Voglio escludere tutti i file sorgente che si trovano in generated/java/invece di main/java.
Amir Pashazadeh

4

È uscito da un po ', ma mi sono imbattuto in questo. Stavo lottando con tutte le esclusioni necessarie. Ho scoperto che era qualcosa di molto più semplice per me. Se segui lo stile di layout del progetto Maven / src / main / java e / src / test / java, devi semplicemente inserire buildDir / classes / main nella configurazione di classDirectories in questo modo:

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

Ho appena visto di nuovo questo. Questo è stato preso direttamente da una configurazione funzionante. Forse la tua versione di Gradle e Jacoco era diversa dalla mia. Scusate.
Randy

4

Il codice seguente esclude anche le classi dalla verifica della copertura:

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

2

alcuni commenti hanno menzionato l'avviso di deprecazione. per risolvere basta usare il getter:

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

2

Per filtrare nel rapporto jacoco, l'esclusione deve essere eseguita in due attività jacocoTestReporte jacocoTestCoverageVerification.

codice di esempio

    def jacocoExclude = ['**/example/**', '**/*Module*.class']

    jacocoTestReport {
        afterEvaluate {
            getClassDirectories().setFrom(classDirectories.files.collect {
                fileTree(dir: it, exclude: jacocoExclude)
            })
        }
    }

    jacocoTestCoverageVerification {
        afterEvaluate {
            getClassDirectories().setFrom(classDirectories.files.collect {
                fileTree(dir: it, exclude: jacocoExclude)
            })
        }

        ...
    }



0

aggiungere sotto la configurazione nel file gradle.properties

coverageExcludeClasses=["com.example.package.elasticsearch.*", "com.example.package2.*",]


coverageExcludeClassesnon sembra essere una cosa in JaCoCo / Gradle
Gus
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.