我目前正在使用一个具有良好覆盖范围的渐变多模块java项目和带有sonarJava插件的声纳库6.2 4.10.0.1026。我正在使用Gradle 4.0.1,声纳库插件2.5和哈科0.7.9!代码是爪哇 8。
由于 API 驱动的开发,API 测试在 API 项目中编写为抽象测试,并从为测试提供构造函数的实现项目中调用。
在sonarqube服务器上分析projekt时,正确测量了实施项目的覆盖率,但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:
因此,声纳的覆盖结果不可用。我读过一篇文章,宣布“sonar.jacoco.reportpath”-参数从sonar 6.2开始,我认为java analyzer 4.4或类似的东西。将此参数添加到我的gradle构建脚本时,脚本将不再编译。当通过sonar项目管理将jacoco.exec文件添加到sonar时,没有任何变化。
如果有办法管理声纳来计算正确的覆盖范围,那就太好了。
我不确定我是否理解为什么只有一些项目有Jacoco而其他项目没有是一个问题。您可以使用Gradle的丰富API(例如TaskCollection和Project)来动态查找它们。
例如:
[':project1', ':project3', ':project5'].each {
project(it) {
apply plugin: 'java'
apply plugin: 'jacoco'
}
}
project(':merger') {
Collection<Project> jacocoProjects = allprojects.findAll { it.plugins.hasPlugin('jacoco' }
evaluationDependsOn jacocoProjects
task jacocoMerge(type: JacocoMerge) {
dependsOn jacocoProjects*.tasks.withType(Test)
executionData jacocoProjects*.tasks.withType(Test)
}
task mergedReport(type: JacocoReport) {
dependsOn jacocoMerge
executionData jacocoMerge.destinationFile
sourceDirectories.add(files(jacocoProjects*.sourceSets*.java.srcDirs))
classDirectories.add(files(jacocoProjects*.sourceSets*.output.classesDir))
}
}
如果您的测试与要报告覆盖范围的源位于不同的项目中,则需要设置其他源Dirs
和额外的ClassDirs
。例如:
evaluationDependsOn ':foo'
task codeCoverageReport(type: JacocoReport) {
additionalSourceDirs.add project(':foo').sourceSets.main.java.sourceDirectories
additionalClassDirs.add project(':foo').sourceSets.main.output.classesDirs
// etc
}
Thx @Lance Java!他向我推荐了一个比下面更干净的解决方案。如果所有子项目都有jacoco报告,这也可以。如果像我一样,只有几个项目的报告,原始解决方案似乎更好。
apply plugin: 'base'
apply plugin: 'org.sonarqube'
[...]
allprojects {
apply plugin: 'java'
apply plugin: "jacoco"
[...]
test {
[...]
jacoco {
append=true
}
}
}
[...]
task jacocoMerge( type: JacocoMerge ) {
dependsOn( subprojects.jacocoTestReport.dependsOn )
mustRunAfter( subprojects.jacocoTestReport.mustRunAfter )
destinationFile = file( "${buildDir}/jacoco/mergedTests.exec" )
executionData = files( subprojects.jacocoTestReport.executionData )
.filter { jacocoReportFile -> jacocoReportFile.exists() }
}
tasks.sonarqube.dependsOn jacocoMerge
[...]
sonarqube {
properties {
[...]
property "sonar.jacoco.reportPath", "${buildDir}/jacoco/*.exec"
}
}
原答复:
需要一些时间才能设法获得声纳的正确覆盖数据。有多个问题需要解决。有时声纳会丢失对类别中雅各科变化的跟踪,因此测试需要参数:
append=true
这并没有完成所有的工作。收集跨项目覆盖范围仍然存在问题。因此,最好的解决方案是强制Jacoco将覆盖范围数据写入单个. exec文件并将其交给声纳。
最终解决方案如下:
apply plugin: 'base'
apply plugin: 'org.sonarqube'
[...]
allprojects {
apply plugin: 'java'
apply plugin: "jacoco"
[...]
test {
[...]
jacoco {
append=true
destinationFile = file( "${rootProject.buildDir}/jacoco/jacocoTest.exec" )
}
}
}
[...]
sonarqube {
properties {
[...]
property "sonar.jacoco.reportPath", "${buildDir}/jacoco/*.exec"
}
}
现在声纳有了我的项目的正确覆盖数据。添加一些额外的测试后,结果如下:
希望这能帮助你们中的一些人…;)
问题内容: 似乎有几个问题,这些问题已经很老了,并且从Java 8对Jacoco的支持开始发生了变化。 我的项目包含以下结构 我已经配置了这样的 主POM.xml Pom.xml B pom.xml 我正在执行此命令。我可以看到jacoco.exec正在生成,但是我看不到任何HTML报告正在验证数据。 请帮我解决一下这个。还有一点是,我的配置对项目是否正确? 更新资料 已确定的问题。 变成 现在,
似乎有几个问题,这些问题很老了,而且从Java 8对Jacoco的支持开始就发生了变化。 我的项目包含以下结构 我已经这样配置了 主要聚甲醛.xml 一个Pom.xml B pom.xml 我正在执行这个命令< code>mvn clean package。我可以看到jacoco.exec正在生成,但是我看不到任何验证数据的HTML报告。 请帮帮我。另一点是,我的配置对于项目是否正确? 更新 已识
我有一个多模块项目和一个家长pom。xml及其两个模块。项目jar和项目。战争所有测试用例都在项目中。罐子当我运行mvn声纳时。母舰pom上的声纳目标,jacoco。未生成exec,代码覆盖率为空。我在父pom中具有以下属性。 请帮忙。我使用的是Sonarqube 4.2。
我有这样的项目结构: 模块应用程序 模块-登录 模块注册 问题:我有上面喜欢Android项目的结构,能够生成jaco代码覆盖率报告,并且可以用于声纳仪表板。我面临的espresso测试问题,它只显示模块应用程序的代码覆盖率,而不显示其他模块的代码覆盖率。Espresso测试正在运行用例流,如注册,然后从其他两个模块登录和调用类,但其他两个模块的覆盖率始终为0%。 < li >我想了解espres
我有一个类似这样的项目结构: -应用 --模块 2 //库模块 --模块3 //库模块 我正在为我的多模块Android项目编写仪器测试用例,其中包含jaco代码覆盖范围。如果我从“app”模块执行检测测试用例,则仅为“app”模块类生成代码覆盖率。 因此,为了获得“模块2”的代码覆盖率 当我在非应用程序模块中执行插装测试用例,无法启动主活动,插装期间应用程序未启动,测试用例失败时,会出现问题。
我有一个maven多模块项目。 所有测试都在称为tests/的单个模块中,所有代码都在单独的模块中。 有没有办法让我得到代码覆盖率?