Gradle을 사용하여 JaCoCo 커버리지 보고서 필터링
문제:
Jacoco에 대한 프로젝트가 있는데 특정 클래스 및/또는 패키지를 필터링할 수 있기를 원합니다.
관련 자료:
다음 문서를 읽었습니다.
공식 자코코 사이트: http://www.eclemma.org/jacoco/index.html
gradle 공식 jacoco 문서: 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 링크:
JaCo & Gradle - 필터링 옵션 (응답 없음)
Sonarrunner 및 Gradle을 사용하여 Jacoco 보고서에서 패키지 제외(Sonar 사용 안 함)
JaCoCo - JSP를 리포트에서 제외합니다(maven에서는 효과가 있는 것 같습니다, gradle을 사용하고 있습니다).
Maven Jacoco 구성 - 클래스/패키지가 작동하지 않는 보고서에서 제외됩니다(maven에서는 효과가 있는 것 같습니다, gradle을 사용하고 있습니다).
JaCo 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"]
}
}
}
질문:.
jacoco 커버리지 보고서를 생성할 때 특정 패키지와 클래스를 제외하려면 어떻게 해야 합니까?
덕분에.Yannick Welsch
:
구글 검색, Gradle 문서 읽기, 오래된 StackOverflow 게시물 검색 후 공식 gradle 포럼에서 이 답을 찾았습니다!
jacocoTestReport {
afterEvaluate {
classDirectories.setFrom(files(classDirectories.files.collect {
fileTree(dir: it, exclude: 'com/blah/**')
}))
}
}
출처: https://issues.gradle.org/browse/GRADLE-2955
5.x보다 오래된 버전의 그래들에서는 를 사용해야 할 수 있습니다.classDirectories = files(classDirectories.files.collect {
대신classDirectories.setFrom
나의 솔루션build.gradle
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/**'])
})
}
}
보다시피, 나는 성공적으로 더 많은 것을 추가할 수 있었다.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/**'])
})
}
}
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
할 수
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/**'
]
)
}))
}
}
보고서를 는 두 에서 제외를 수행해야 합니다.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)
})
}
...
}
ANT에서의 이 문제에 대한 해결책을 다음에 제시하겠습니다.이것은 아래를 추가함으로써 gradle에 적응할 수 있습니다.jacocoTestReport
과제. Jacoco에 의해 실제로 문서화된 것은 아니지만, 현재로서는 테스트 결과를 필터링할 수 있는 유일한 방법인 것 같습니다.
afterEvaluate {
classDirectories = files(classDirectories.files.collect {
fileTree(dir: it, exclude: 'excluded/files/**')
})
}
Kotlin 사용자를 위해 사용한 것은 다음과 같습니다(Gradle 6.7).
build.gradle.kts
tasks.jacocoTestReport {
// tests are required to run before generating the report
dependsOn(tasks.test)
// print the report url for easier access
doLast {
println("file://${project.rootDir}/build/reports/jacoco/test/html/index.html")
}
classDirectories.setFrom(
files(classDirectories.files.map {
fileTree(it) {
exclude("**/generated/**", "**/other-excluded/**")
}
})
)
}
https://github.com/gradle/kotlin-dsl-samples/issues/1176#issuecomment-610643709 를 참조해 주세요.
이게 나온 지 꽤 됐는데, 우연히 이걸 발견했어요.나는 필요한 모든 제외에 허덕이고 있었다.나는 그것이 나에게 훨씬 더 간단한 것임을 알았다.Maven 프로젝트 레이아웃 스타일 /src/main/java 및 /src/test/java를 따를 경우 다음과 같이 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/**'])
})
}
}
커버리지 리포트에서 특정 패키지를 필터링하기 위해 여전히 머리를 긁적거리고 있는 사용자를 위해 최신 라이브러리를 사용하는 데 도움이 되는 구성을 소개합니다.
Build tool: Gradle 6.5 (also tried for 6.7)
Coverage Tool: Jacoco 0.8.5
고려해야 할 사항 / 정당성
afterScript
가 아니다- 보고서 생성 및 커버리지 검증용으로 1회, 2회 제외 필요
- IDE에서는 intellij IDE를 사용할 합니다.
excludes
대신 합니다.exclude
중 어느 이든 잘 - regex를 해야 .
.class
이 파일입니다..java
files.complete files files files files files files files files. - 들 5, 스스,,, 5,
classDirectories
는 읽기 「」를 합니다.classDirectories.setFrom
jacocoTestReport {
doLast {
println("See report file://${project.rootDir}/build/reports/jacoco/test/html/index.html")
}
excludedClassFilesForReport(classDirectories)
}
jacocoTestCoverageVerification {
excludedClassFilesForReport(classDirectories)
violationRules {
rule {
limit {
minimum = 0.55
}
}
}
}
private excludedClassFilesForReport(classDirectories) {
classDirectories.setFrom(files(classDirectories.files.collect {
fileTree(dir: it, exclude: [
'**/common/apigateway/*.class',a
'**/common/*/client/*Client*.class',
'**/configuration/*ClientConfiguration.class',
'**/model/search/*SearchService.class'
])
}))
}
check.dependsOn jacocoTestCoverageVerification
저는 두 곳에서 제외를 해야 합니다.
jacocoTestReport {
dependsOn test // tests are required to run before generating the report
afterEvaluate {
excludedClassFilesForReport(classDirectories)
}
}
jacocoTestCoverageVerification {
afterEvaluate {
excludedClassFilesForReport(classDirectories)
}
}
private excludedClassFilesForReport(classDirectories) {
classDirectories.setFrom(files(classDirectories.files.collect {
fileTree(dir: it,
exclude: [
'com/test/a/config/**',
'com/test/b/constant/**',
'com/test/c/MainApp.class'
]
)
}))
}
Kotlin DSL에서 이 답을 찾고 있는 분들을 위해 다음과 같은 정보가 있습니다.
val jacocoExclude = listOf("**/entities/**", "**/dtos/**")
jacocoTestReport {
reports {
xml.isEnabled = true
csv.isEnabled = false
}
classDirectories.setFrom(classDirectories.files.map {
fileTree(it).matching {
exclude(jacocoExclude)
}
})
}
test {
useJUnitPlatform()
systemProperty("gradle.build.dir", project.buildDir)
finalizedBy(jacocoTestReport)
extensions.configure(JacocoTaskExtension::class) {
excludes = jacocoExclude
}
}
일부 코멘트에서는 폐지 경고를 언급하고 있습니다.해결하려면 getter를 사용합니다.
afterEvaluate {
getClassDirectories().from(files(classDirectories.files.collect {
fileTree(dir: it, exclude: 'com/blah/**')
}))
}
gradle.properties 파일에 아래 구성을 추가합니다.
coverageExcludeClasses=["com.example.package.elasticsearch.*", "com.example.package2.*",]
그라들 6.8.3입니다. Cannot set the value of read-only property 'classDirectories' for task ':jacocoTestReport' of type org.gradle.testing.jacoco.tasks.JacocoReport.
그래서 저는 이 문제를 해결할 방법을 찾았습니다.
classDirectories.setFrom(
fileTree(dir: "build/classes/java/main")
.filter({file -> !file.path.contains('/dir1')})
.filter({file -> !file.path.contains('/dir2')})
.filter({file -> !file.path.contains('/dir3')})
)
Jacoco 0.8.5를 사용한 Gradle에서의 작업 설정을 다음에 나타냅니다.
def jacocoExclusions = [
'**/config/*Config.class',
'**/config/*Advice.class',
'**/security/*AuthorityRoles.class',
'**/*Application.class'
];
jacocoTestReport {
reports {
xml.enabled false
csv.enabled false
html.destination file("${buildDir}/reports/jacocoHtml")
}
afterEvaluate {
classDirectories.setFrom(files(classDirectories.files.collect {
fileTree(dir: it,
exclude: jacocoExclusions
)
}))
}
}
jacocoTestCoverageVerification {
afterEvaluate {
classDirectories.setFrom(files(classDirectories.files.collect {
fileTree(dir: it,
exclude: jacocoExclusions
)
}))
}
violationRules {
rule {
excludes = jacocoExclusions
limit {
minimum = 0.90
}
}
}
}
언급URL : https://stackoverflow.com/questions/29887805/filter-jacoco-coverage-reports-with-gradle
'programing' 카테고리의 다른 글
v-clock 역이 있나요? (0) | 2022.09.28 |
---|---|
CSV 데이터를 NumPy의 레코드 어레이로 읽으려면 어떻게 해야 합니까? (0) | 2022.09.28 |
캐시된 PHP 생성 미리 보기가 느리게 로드됩니다. (0) | 2022.09.28 |
ES6 제너레이터에서 redux-saga를 사용하는 것과 ES2017 비동기/대기에서 redux-thunk를 사용하는 것의 장단점 (0) | 2022.09.21 |
구성 요소에서 Vuex 데이터스토어를 찾을 수 없습니다. (0) | 2022.09.21 |