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

문제:

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

관련 문서 :

다음 문서를 읽었습니다.

공무원 사이트 :
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"]
        }
    }
}

질문:

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



답변

덕분에 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


답변

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

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


답변

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

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


답변

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


답변

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

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


답변

이것은 잠시 동안 나왔지만 방금 이것을 우연히 만났습니다. 나는 필요한 모든 배제로 고군분투하고 있었다. 나는 그것이 나에게 훨씬 더 단순한 것임을 알았다. 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
                     ]
        )
    }
}


답변

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

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