programing

Gradle을 사용하여 JaCoCo 커버리지 보고서 필터링

nicescript 2022. 9. 28. 21:50
반응형

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 링크:

JaCo & Gradle - 필터링 옵션 (응답 없음)

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

JaCoCo - JSP를 리포트에서 제외합니다(에서는 효과가 있는 것 같습니다, 을 사용하고 있습니다).

Maven Jacoco 구성 - 클래스/패키지가 작동하지 않는 보고서에서 제외됩니다(에서는 효과가 있는 것 같습니다, 을 사용하고 있습니다).

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

질문:.

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

덕분에.Yannick Welsch:

구글 검색, Gradle 문서 읽기, 오래된 StackOverflow 게시물 검색 후 공식 포럼에서 이 답을 찾았습니다!

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.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할 수

    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이 파일입니다..javafiles.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

반응형