Gradle로 JaCoCo 커버리지 보고서 필터링


113

문제:

나는 프로젝트가 있습니다 특정 클래스 및 / 또는 패키지를 필터링하고 싶습니다.

관련 문서 :

다음 문서를 읽었습니다.

공무원 사이트 : http://www.eclemma.org/jacoco/index.html

공무원 문서 : https://gradle.org/docs/current/userguide/jacoco_plugin.html

공무원 Github문제, 커버리지 작업 : https://github.com/jacoco/jacoco/wiki/FilteringOptions https://github.com/jacoco/jacoco/issues/14

관련 StackOverflow 링크 :

JaCoCo 및 Gradle-필터링 옵션 (답변 없음)

Sonarrunner 및 Gradle을 사용하여 Jacoco 보고서에서 패키지 제외 (사용하지 않음))

JaCoCo-보고서에서 JSP 제외 (, 나는 사용하고 있습니다 )

Maven Jacoco 구성-작동하지 않는 보고서에서 클래스 / 패키지 제외 합니다., 나는 사용하고 있습니다 )

JaCoCo gradle 플러그인 제외 (이 작업을 수행 할 수 없음)

Gradle Jacoco-커버리지 보고서에는 구성에서 제외 된 클래스가 포함되어 있습니다 (매우 가깝게 보였고 사용 doFirst했으며 나를 위해 작동하지 않았습니다)

내가 시도한 것의 예 :

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

질문:

생성 할 때 특정 패키지 및 클래스를 제외하려면 어떻게해야합니까? 커버리지 보고서?


타사 옵션 (FD 나는의 설립자 해요) : 당신이 보고서를 업로드하면 Codecov 당신이 할 수 있는 모든 파일 무시 (가) 제품의 기능 섹션에서 사후 좋아하세요. 감사.
— Steve Peak

@StevePeak 그래서 당신은 packages사용하여 온라인으로 필터링 할 수 Codecov있습니까? 또한, 지원 Github은 어떻 Android습니까 Java? 여전히 모든 보고서를 보낸 다음 이전에 필터링 한 후 필터링해야합니다.
— Jared Burrows

포함하지 않으려는 파일의 regexp 방법을 기반으로 필터링 할 수 있습니다. 모든 자바는 Jacoco 보고서를 통해 지원됩니다. Codecov의 사실 이후 필터링이 작동합니다. 필터를 기억하고 향후 모든 보고서에 적용합니다. 감사!
— Steve Peak

6
궁금해; 무엇을 않는 excludes공식 문서에서 실제로 할 다음? 거의 쓸모가 없습니까?
— Vivin Paliath

그것은 excludes커버리지 작업이 아니라 테스트 작업에 있습니다. JaCoCo에 의해 인스 트루먼 테이션되는 파일을 제외하므로 커버리지가 기록됩니다. 일부 클래스에 대한 커버리지를 기록하지 않으려는 경우, 다른 계측 에이전트와의 충돌로 인해 할 수없는 경우 또는 사전 계측 된 클래스로 인해이를 사용할 수 있습니다. 이것은 보고서에서 클래스를 제외하지 않을 것입니다. 특히 마지막으로 언급 한 경우에 이것은 끔찍한 아이디어가 될 것입니다.
— Vampire

답변:


115

덕분에 Yannick Welsch:

Google을 검색하고 Gradle 문서를 읽고 이전 StackOverflow 게시물을 살펴본 후이 답변을 공식에서 찾았습니다. 포럼!

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

출처 : https://issues.gradle.org/browse/GRADLE-2955

내 build.gradleJava / 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/**'])
        })
    }
}

보시다시피 exclude:몇 개의 패키지를 필터링하기 위해 더 많은 것을 성공적으로 추가 할 수있었습니다 .

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

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

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


1
@BradPitcher 문제 없습니다! 정답을 찾는 데 시간이 걸렸습니다. 너무 "해커"처럼 보입니다. 나는 그들이 더 좋은 방법을 제시하기를 바랍니다.
— Jared Burrows

그렇다면 패키지에서 하나의 클래스를 제외하려는 경우 올바른 접근 방식은 무엇입니까?
— Pedro Henrique 2015 년

2
같은 것 :exclude: ['**/*Test*.*'])
— Jared Burrows

1
jacocoTestReportjacoco및 java플러그인 모두에서만 작동합니다 . 이것은 Android 용이 아닙니다. 안드로이드 여기 내 REPO를 참조하십시오 github.com/jaredsburrows/android-gradle-java-template/blob/...
— 자레드 버로우

9
classDirectories =이 경고가 발생합니다. The JacocoReportBase.setClassDirectories(FileCollection) method has been deprecated. This is scheduled to be removed in Gradle 6.0. Use getClassDirectories().from(...). Gradle 6.0과 호환되는 솔루션을 보여 주면 좋을 것입니다.
— Thunderforge

61

Gradle 버전 5.x의 경우 classDirectories = files(...)는 사용 중단 경고를 표시하고 Gradle 6.0부터 전혀 작동하지 않습니다. 이것은 클래스를 제외하는 더 이상 사용되지 않는 방법입니다.

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

2
또는 단순히 (대신 목록을 무시 목록에 추가 할) classDirectories.from를 사용
— 모하메드 엘 - Beltagy

1
여러 경로를 포함하기 위해 []뒤에 추가 exclude: 합니다.
— WesternGun

훌륭합니다. 저는 gradle 6.0.1을 사용하고이 솔루션이 저에게 효과적이었습니다.
— Dargenn

14

나를 위해, 그것은 함께 일하는 것이 좋습니다

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

문서 https://docs.gradle.org/current/userguide/jacoco_plugin.html#N16E62에 명시된대로 있고 처음에 질문하므로 대답은 다음과 같습니다.

그래서 당신이 나에게 묻는다면 : 그것은 질문이 아닙니다

excludes = ["projecteuler/**"]

또는

excludes += ["projecteuler/**"]

그러나

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

패키지를 제외하려면 *.projecteuler.*

및 test {}프로젝트 수준에서 중첩되지jacocoTestReport


1
이것은 클래스를 모두 생략하지 않고 0 % 커버리지를 제공하는 것 같습니다. JaCoCi 0.8.5와 Gradle 6.0을 사용하고 있습니다
— tschumann

이것은 jacoco에게 일부 클래스와 간섭하지 않도록 지시하는 올바른 방법이며 다른 접근 방식은보고 부분에만 영향을 미칩니다.
— Brice

9

Gradle6의 경우 다음과 같이 사용하십시오.을 만들었 classDirectories as final으므로 다시 할당 할 수 없지만 classDirectories.setFrom활용할 수 있는 setter 메서드가 있습니다.

    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

다음 은 ANT에서이 문제에 대한 해결책입니다. jacocoTestReport작업 아래에 다음을 추가하여 gradle에 적용 할 수 있습니다 . 이것이 실제로 jacoco에 의해 문서화되지는 않았지만 지금은 테스트 결과를 필터링하는 유일한 방법 인 것 같습니다.

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

알겠습니다. 제 결과가 올바른지 확인해 주셔서 감사합니다. 앞으로 더 쉽게 필터링하거나 Gradle을 사용하여 필터링하는 방법을 문서화하기를 바랍니다.
— Jared Burrows

jacoco 보고서에 포함되지 않도록 소스 세트를 제외하는 방법이 있습니까? generated/java/대신에 있는 모든 소스 파일을 제외하고 싶습니다 main/java.
— Amir Pashazadeh

4

이것은 잠시 동안 나왔지만 방금 이것을 우연히 만났습니다. 나는 필요한 모든 배제로 고군분투하고 있었다. 나는 그것이 나에게 훨씬 더 단순한 것임을 알았다. Maven 프로젝트 레이아웃 스타일 / src / main / java 및 / src / test / java를 따르는 경우 다음과 같이 classDirectories 구성 에 buildDir / classes / main 을 추가하기 만하면됩니다 .

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

다시 봤어요. 이것은 작동하는 구성에서 직접 가져 왔습니다. 아마도 귀하의 Gradle 및 Jacoco 버전이 내 버전과 다를 수 있습니다. 죄송합니다.
— Randy

4

아래 코드는 커버리지 확인에서도 클래스를 제외합니다.

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

2

일부 의견은 지원 중단 경고를 언급했습니다. 해결하려면 getter를 사용하십시오.

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

2

jacoco 보고서에 필터하기 위해, 배제의 필요성이 작업에서 수행되어야 jacocoTestReport하고jacocoTestCoverageVerification .

샘플 코드

    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 파일에 아래 구성 추가

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


coverageExcludeClassesJaCoCo / Gradle
— Gus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.