JaCoCo kapsam raporlarını Gradle ile filtreleyin


113

Sorun:

İle bir projem var ve belirli sınıfları ve / veya paketleri filtreleyebilmek istiyorum.

İlgili Belgeler:

Aşağıdaki belgeleri okudum:

Resmi site: http://www.eclemma.org/jacoco/index.html

Resmi için dokümanlar : https://gradle.org/docs/current/userguide/jacoco_plugin.html

Resmi Githubkapsam üzerinde çalışan sorunlar: https://github.com/jacoco/jacoco/wiki/FilteringOptions https://github.com/jacoco/jacoco/issues/14

İlgili StackOverflow Bağlantıları:

JaCoCo & Gradle - Filtreleme Seçenekleri (Yanıt yok)

Sonarrunner ve Gradle kullanarak paketleri Jacoco raporundan hariç tutun (Kullanılmıyor)

JaCoCo - JSP'yi rapordan hariç tut (İşe yarıyor gibi görünüyor, Ben kullanıyorum )

Maven Jacoco Yapılandırması - Çalışmayan rapordan sınıfları / paketleri hariç tut ( gibi görünüyor, Ben kullanıyorum )

JaCoCo gradle eklentisi hariç tut (Bu işe yaramadı)

Gradle Jacoco - kapsam raporları yapılandırmada hariç tutulan sınıfları içerir (Çok yakın görünüyor, kullanılmış doFirst, benim için çalışmadı)

Denediklerime bir örnek:

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

Soru:

Oluştururken belirli paketleri ve sınıfları nasıl dışlayabilirim kapsama raporları?


Üçüncü taraf seçeneği (kurucusuyum FD): Codecov'a rapor yüklerseniz , ürünün özellikler bölümünden sonra beğendiğiniz herhangi bir dosyayı göz ardı edebilirsiniz . Teşekkürler.
Steve Peak

@StevePeak Yani packageskullanarak çevrimiçi olarak filtreleyebilirsiniz Codecov? Ayrıca gördüm, destek Githubne olacak Android, gördüm Java. Yine de size tüm raporları göndermem ve daha sonra filtrelemeye göre filtrelemem gerekir.
Jared Burrows

Dahil etmek istemediğiniz herhangi bir dosyaya bir regexp yöntemine göre filtre uygulayabilirsiniz. Tüm java, Jacoco raporları aracılığıyla desteklenir. Sadece Codecov'da işe yaradıktan sonra filtrelemek. Filtrelerinizi hatırlayacak ve bunu gelecekteki tüm raporlara uygulayacaktır. Teşekkürler!
Steve Peak

6
Merak ediyorum; ne gelmez excludesresmi belgelerinden aslında yapmak o zaman? Neredeyse yararsız mı?
Vivin Paliath

Bu excludeskapsam görevinde değil, test görevinde. Dosyaları JaCoCo tarafından kullanılmaktan ve dolayısıyla kayıt kapsamından hariç tutar. Bunu, bazı sınıflar için kapsamı kaydetmek istemiyorsanız, başka bir enstrümantasyon ajanıyla bir çelişki nedeniyle yapamıyorsanız veya sınıfları önceden ayarladığınız için kullanabilirsiniz. Bu, bir sınıfı raporun dışında bırakmayacaktır, özellikle de bahsedilen son durumda, bu korkunç bir fikir olur.
Vampir

Yanıtlar:


115

Teşekkürler Yannick Welsch:

Google'da arama yaptıktan, Gradle belgelerini okuduktan ve daha eski StackOverflow gönderilerinden geçtikten sonra, bu yanıtı Resmi forumlar!

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

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

build.gradleJava / Groovy projelerim için çözüm :

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/**'])
        })
    }
}

Gördüğünüz gibi, exclude:birkaç paketi filtrelemek için başarıyla daha fazlasını ekleyebildim .

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

Android gibi diğer projeler için özel görevler:

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/**'])
        })
    }
}

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


1
@BradPitcher Sorun değil! Doğru cevabı bulmam biraz zaman aldı. Çok "hilekâr" görünüyor. Umarım daha güzel bir yol bulurlar.
Jared Burrows

Öyleyse, sadece bir sınıfı paketten çıkarmak istiyorsam doğru yaklaşım nedir?
Pedro Henrique

2
Şunun gibi bir şey:exclude: ['**/*Test*.*'])
Jared Burrows

1
jacocoTestReportSadece ikisi birlikte çalışır jacocove javaeklentileri. Bu Android için değil. Lütfen android için buradaki depoma
Jared Burrows

9
classDirectories =Bu uyarı sonuçlanır. The JacocoReportBase.setClassDirectories(FileCollection) method has been deprecated. This is scheduled to be removed in Gradle 6.0. Use getClassDirectories().from(...). Gradle 6.0 ile uyumlu bir çözüm göstermek harika olurdu.
Thunderforge

61

Gradle sürüm 5.x için classDirectories = files(...), bir kullanımdan kaldırma uyarısı verir ve Gradle 6.0'dan itibaren hiç çalışmaz. Bu, sınıfları hariç tutmanın kesin olmayan bir yoludur:

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

2
Veya sadece classDirectories.from kullanın (listeyi geçersiz kılmak yerine listeye eklemek için)
Mohamed El-Beltagy

1
Birkaç yolu dahil etmek için []sonrasını ekleyeceksiniz exclude: .
WesternGun

Mükemmel, gradle 6.0.1 kullanıyorum ve bu çözüm benim için çalıştı.
Dargenn

14

benim için birlikte çalışmak güzel

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

https://docs.gradle.org/current/userguide/jacoco_plugin.html#N16E62 belgelerinde belirtildiği gibi ve başlangıçta sorulduğu gibi, cevap şu şekildedir:

bu yüzden bana sorarsan: bu bir soru değil

excludes = ["projecteuler/**"]

veya

excludes += ["projecteuler/**"]

fakat

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

bir paketi hariç tutmak *.projecteuler.*

ve test {}proje düzeyinde, iç içe değiljacocoTestReport


1
Bu, sınıfları tamamen çıkarmak yerine% 0 kapsama sağlıyor gibi görünüyor. JaCoCi 0.8.5 ve Gradle 6.0 kullanıyorum
tschumann

Bu, jacoco'ya bazı sınıflara karışmamasını söylemenin doğru yolu, diğer yaklaşımlar yalnızca raporlama kısmını etkiler.
Brice

9

Yaptıkları çünkü aşağıda gibi Gradle6 Kullanım şey için, classDirectories as finalbiz onu yeniden atamak olamaz, ama bir ayarlayıcı yöntem var classDirectories.setFromyararlanılabilecek düzeyde

    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

İşte ANT'deki bu problem için bir çözüm. Bu, jacocoTestReportgörevin altına aşağıdakileri ekleyerek derecelendirmek üzere uyarlanabilir . Bu gerçekten jacoco tarafından belgelenmemiş olsa da, şimdilik test sonuçlarını filtrelemenin tek yolu gibi görünüyor.

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

Pekala, bulgularımın doğru olduğunu onayladığınız için teşekkür ederim! Umarım gelecekte filtrelemeyi kolaylaştırırlar veya Gradle kullanarak nasıl filtreleme yapılacağını belgelendirirler.
Jared Burrows

Bir kaynak kümesini jacoco raporuna dahil etmenin herhangi bir yolu var mı? Ben bulunan tüm kaynak dosyaları dışlamak istediğiniz generated/java/yerine main/java.
Amir Pashazadeh

4

Bu bir süredir ortalıkta yok ama ben bununla karşılaştım. İhtiyaç duyulan tüm istisnalarla mücadele ediyordum. Benim için çok daha basit bir şey olduğunu anladım. Maven proje düzeni stilini / src / main / java ve / src / test / java izlerseniz , classDirectories yapılandırmanıza şu şekilde buildDir / classes / main koymanız yeterlidir :

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

Bunu tekrar gördüm. Bu, doğrudan çalışan bir yapılandırmadan alınmıştır. Belki de Gradle ve Jacoco versiyonunuz benimkinden farklıydı. Afedersiniz.
Randy

4

Aşağıdaki kod, sınıfları da kapsam doğrulamasının dışında tutar:

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

2

bazı yorumlarda kullanımdan kaldırma uyarısından bahsedildi. çözmek için sadece alıcıyı kullanın:

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

2

Jacoco raporunda filtreleme yapmak için iki görevde jacocoTestReportve jacocoTestCoverageVerification.

basit kod

    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

gradle.properties dosyasında aşağıdaki yapılandırmayı ekleyin

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


coverageExcludeClassesJaCoCo / Gradle'da bir şey gibi görünmüyor
Gus
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.