当前位置: 首页 > 知识库问答 >
问题:

Gradle多模块项目中sonarqube 6.2中的错误覆盖计算

杨利
2023-03-14

我目前正在使用一个具有良好覆盖范围的渐变多模块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:

  • JaCoCo(CODECOVERAGERPORT任务)
    • 73%的指令覆盖率
    • 91%的分行覆盖率
      < li>43.1%的线路覆盖率(计算中仅考虑约30%的线路!) < li>82.1%的条件覆盖率(仅覆盖约20%的条件!)

    因此,声纳的覆盖结果不可用。我读过一篇文章,宣布“sonar.jacoco.reportpath”-参数从sonar 6.2开始,我认为java analyzer 4.4或类似的东西。将此参数添加到我的gradle构建脚本时,脚本将不再编译。当通过sonar项目管理将jacoco.exec文件添加到sonar时,没有任何变化。

    如果有办法管理声纳来计算正确的覆盖范围,那就太好了。

共有3个答案

萧越泽
2023-03-14

我不确定我是否理解为什么只有一些项目有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))
    }
}
秦安怡
2023-03-14

如果您的测试与要报告覆盖范围的源位于不同的项目中,则需要设置其他源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
} 
吴飞语
2023-03-14

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

现在声纳有了我的项目的正确覆盖数据。添加一些额外的测试后,结果如下:

    < li >总覆盖率91.6% < li >线路覆盖率91.7% < li >条件覆盖率91.3% < li >未覆盖的线36 < li >未覆盖的条件11 < li >覆盖433的线条 < li >单元测试1,114 < li >单元测试错误0 < li >单元测试失败0次 < li >跳过了单元测试0 < li >单元测试成功(%) 100.0% < li >单元测试持续时间4s

希望这能帮助你们中的一些人…;)

 类似资料:
  • 问题内容: 似乎有几个问题,这些问题已经很老了,并且从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/的单个模块中,所有代码都在单独的模块中。 有没有办法让我得到代码覆盖率?