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
jacocoTestReportjacocojava플러그인 모두에서만 작동합니다 . 이것은 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.