我目前正在使用具有良好覆盖率的gradle多模块Java项目和sonarqube 6.2与sonarJava插件4.10.0.1026.我正在使用Gradle 4.0.1,sonarqube插件2.5和jacoco 0.7.9!代码是java 8.
由于API驱动的开发,API测试在API项目中被编写为抽象测试,并从提供测试构造函数的实现项目中调用.
在分析sonarqube服务器上的项目时,实施项目的覆盖范围是正确测量的,但IMPL项目测试中包含的API项目的覆盖率为0.0%.这些项目的覆盖率结果将被忽略.
当简单地使用jacoco插件时,我能够获得相同的行为.在做了一些研究之后,我找到了一个获得正确的jacoco报告的解决方案:
task codeCoverageReport(type: JacocoReport) {
description "Creates a unified JaCoCo test report for the project."
// Gather execution data from all subprojects
// (change this if you e.g. want to calculate unit test/integration test
coverage separately)
executionData fileTree(project.rootDir.absolutePath).include("**/build/jacoco/*.exec")
// Add all relevant sourcesets from the subprojects
subprojects.each {
sourceSets it.sourceSets.main
}
reports {
xml.enabled true
html.enabled true
html.destination file("${buildDir}/reports/jacoco")
csv.enabled false
}
}
// always run the tests before generating the report
codeCoverageReport.dependsOn {
subprojects*.test
}
我目前的结果如下:
JaCoCo:
> JaCoCo(codeCoverageReport-Task)
> 73%的教学覆盖率
> 91%的分行覆盖率
>声纳
> 43.1%的线覆盖率(在计算中只考虑约30%的线!)
> 82.1%条件覆盖率(仅涵盖约20%的条件!)
因此声纳的覆盖率结果不可用.我已经阅读了一篇帖子,宣布从声纳6.2开始宣布“sonar.jacoco.reportPaths”参数,我认为java-analyzer 4.4或者……像那样.将此参数添加到我的gradle构建脚本时,脚本不再编译.通过声纳项目管理将jacoco .exec文件添加到声纳时没有任何变化.
如果有办法管理声纳来计算正确的覆盖范围,那就太好了.
解决方法:
如果您的测试与您希望覆盖率报告的源不同,那么您需要设置additionalSourceDirs和additionalClassDirs.例如:
evaluationDependsOn ':foo'
task codeCoverageReport(type: JacocoReport) {
additionalSourceDirs.add project(':foo').sourceSets.main.java.sourceDirectories
additionalClassDirs.add project(':foo').sourceSets.main.output.classesDirs
// etc
}