Jar*_*ows 86 java unit-testing code-coverage gradle jacoco
我有一个jacoco项目,我希望能够过滤某些类和/或包.
我已阅读以下文档:
官方jacoco网站: http ://www.eclemma.org/jacoco/index.html
关于gradle的官方jacoco文档: https ://gradle.org/docs/current/userguide/jacoco_plugin.html
官方jacoco Github问题,致力于报道:
https
://github.com/jacoco/jacoco/wiki/FilteringOptions https://github.com/jacoco/jacoco/issues/14
JaCoCo&Gradle - 过滤选项(无答案)
使用Sonarrunner和Gradle(不使用声纳)从Jacoco报告中排除软件包
JaCoCo - 从报告中排除JSP(它似乎适用于maven,我使用gradle)
Maven Jacoco配置 - 从报告中排除类/包不工作(它似乎适用于maven,我使用gradle)
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"]
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何在生成jacoco覆盖率报告时排除某些包和类?
Jar*_*ows 96
Yannick Welsch:在搜索Google,阅读Gradle文档并浏览旧的StackOverflow帖子后,我在官方gradle论坛上找到了这个答案!
jacocoTestReport {
afterEvaluate {
classDirectories = files(classDirectories.files.collect {
fileTree(dir: it, exclude: 'com/blah/**')
})
}
}
Run Code Online (Sandbox Code Playgroud)
资料来源: https ://issues.gradle.org/browse/GRADLE-2955
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/**'])
})
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我成功地添加了更多内容exclude:以过滤一些包.
资料来源: https ://github.com/jaredsburrows/CS-Interview-Questions/blob/master/build.gradle
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/**'])
})
}
}
Run Code Online (Sandbox Code Playgroud)
资料来源: https ://github.com/jaredsburrows/android-gradle-java-app-template/blob/master/gradle/quality.gradle#L59
uwe*_*uwe 16
对于Gradle 5.0版和更高版本,会classDirectories = files(...)给出弃用警告。这是不推荐使用的排除类的方法:
jacocoTestReport {
afterEvaluate {
classDirectories.setFrom(files(classDirectories.files.collect {
fileTree(dir: it, exclude: 'com/exclude/**')
}))
}
}
Run Code Online (Sandbox Code Playgroud)
Ema*_*rco 16
对于 Kotlin 用户,这是我使用的(gradle 6.7)
构建.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/**")
}
})
)
}
Run Code Online (Sandbox Code Playgroud)
如此处建议的: https: //github.com/gradle/kotlin-dsl-samples/issues/1176#issuecomment-610643709
小智 15
对于 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/**'
]
)
}))
}
}
Run Code Online (Sandbox Code Playgroud)
chi*_*.de 13
对我来说,这很好用
test {
jacoco {
excludes += ['codeeval/**',
'crackingthecode/part3knowledgebased/**',
'**/Chapter7ObjectOrientedDesign**',
'**/Chapter11Testing**',
'**/Chapter12SystemDesignAndMemoryLimits**',
'projecteuler/**']
}
}
Run Code Online (Sandbox Code Playgroud)
如文档 https://docs.gradle.org/current/userguide/jacoco_plugin.html#N16E62中所述,并且最初询问的答案如下:
所以如果你问我:这不是问题
excludes = ["projecteuler/**"]
Run Code Online (Sandbox Code Playgroud)
要么
excludes += ["projecteuler/**"]
Run Code Online (Sandbox Code Playgroud)
但
excludes = ["**/projecteuler/**"]
Run Code Online (Sandbox Code Playgroud)
排除包裹 *.projecteuler.*
并test {}在项目层面,而不是在嵌套jacocoTestReport
小智 10
为了在 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)
})
}
...
}
Run Code Online (Sandbox Code Playgroud)
小智 7
对于那些仍然绞尽脑汁从覆盖率报告中过滤某些包的人来说,这里是适合我使用最新库的配置。
Build tool: Gradle 6.5 (also tried for 6.7)
Coverage Tool: Jacoco 0.8.5
Run Code Online (Sandbox Code Playgroud)
需要考虑的事项/理由
afterScript不需要excludesparam 而不是exclude. 两者都可以正常工作.class文件而不是.java文件。classDirectories是一个只读字段,因此,使用classDirectories.setFromjacocoTestReport {
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',
'**/common/*/client/*Client*.class',
'**/configuration/*ClientConfiguration.class',
'**/model/search/*SearchService.class'
])
}))
}
check.dependsOn jacocoTestCoverageVerification
Run Code Online (Sandbox Code Playgroud)
这是ANT中此问题的解决方案.这可以通过在jacocoTestReport任务下添加以下内容来适应.尽管jacoco没有真正记录这一点,但它似乎是目前过滤测试结果的唯一方法.
afterEvaluate {
classDirectories = files(classDirectories.files.collect {
fileTree(dir: it, exclude: 'excluded/files/**')
})
}
Run Code Online (Sandbox Code Playgroud)
这已经有一段时间了,但我刚刚遇到了这个。我正在为所有需要的排除而苦苦挣扎。我发现这对我来说要简单得多。如果您遵循 Maven 项目布局样式 /src/main/java 和 /src/test/java,您只需要将buildDir/classes/ main 放在您的classDirectories配置中,如下所示:
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
]
)
}
}
Run Code Online (Sandbox Code Playgroud)
下面的代码也从覆盖率验证中排除了类:
jacocoTestCoverageVerification {
afterEvaluate {
classDirectories = files(classDirectories.files.collect {
fileTree(dir: "${project.buildDir}/classes/main",
exclude: ['**/packagename/**'])
})
}
}
Run Code Online (Sandbox Code Playgroud)
对于那些在 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
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
52296 次 |
| 最近记录: |