【问题标题】:Sonarqube overall coverage does not match jacoco report coverageSonarqube 的整体覆盖范围与 jacoco 报告的覆盖范围不匹配
【发布时间】:2017-03-06 17:29:49
【问题描述】:

我有一个多模块 Android 项目,我发现 jacoco 报告的报道与 Sonarqube 报告的报道之间存在差异。 该项目也是一个多风味的项目,会产生许多不同的变体。我正在使用this plugin 来帮助我生成所有任务。这些任务为每个变体生成单独的报告。

当我运行我的 jacoco 报告时,我看到了这个:

当我运行声纳扫描仪时,我看到:

我的项目中有一些排除项,但即使没有它们,覆盖率 %s 也不匹配。

我觉得我提供的字节码可能与this question: 中提示的字节码不同

这是我的相关信息: 声纳 5.6 版。

Gradle 赛跑者

plugins { id "org.sonarqube" version "2.0.1" }

声纳配置:(在根 build.gradle 上)

sonarqube {
    properties {
        property "sonar.projectKey", "com.xxx.myApp"
        property "sonar.projectName", "Android My App"
        property "sonar.projectVersion", "3.0"
        property "sonar.java.binaries", "build/classes"
        property "sonar.coveragePlugin", "jacoco"
        property "sonar.jacoco.reportMissing.force.zero", "false"
    }
}

声纳配置(在 app/build.gradle 上)

sonarqube {
    properties {
        property "sonar.sources", "src/main/java"
        property "sonar.tests", "src/test/java"
        property "sonar.java.tests", "src/test/java"
        property "sonar.junit.reportsPath", "build/test-results/myAppGoogleMobileDebug"
        property "sonar.java.binaries", "build/intermediates/classes/myAppGoogleMobile/debug"
        property "sonar.jacoco.reportPath", "build/jacoco/testMyAppGoogleMobileDebugUnitTest.exec"
        property "sonar.coverage.exclusions", coverageExclusions

    }
}

Jacoco 配置 (app/build.gradle)

def coverageExclusions = ['**/AEWatchApp.*', '**/**_Factory.*',
                          '**/QaSettingsActivity.*',
                          'com/aetn/android/tveapps/activities/**',
                          'com/aetn/android/tveapps/test/**',
                          'com/aetn/android/tveapps/app/injection/modules/**',
                          'com/aetn/android/tveapps/app/injection/components/**',
                          'com.aetn.android.tveapps.mock/**',
                          'com/aetn/android/tveapps/databinding/**']


jacocoAndroidUnitTestReport {
    csv.enabled false
    html.enabled true
    xml.enabled true
    excludes += coverageExclusions
}

【问题讨论】:

    标签: android sonarqube code-coverage jacoco


    【解决方案1】:

    据我所知,分支覆盖率是相同的:两种情况下都是 40%,15 个未覆盖。

    将“说明”(显示在 JaCoCo 报告的屏幕截图中)与其他任何内容进行比较就像比较苹果和橙子 - 它们并不代表相同的东西。有关 JaCoCo 提供的计数器,请参阅 http://www.eclemma.org/jacoco/trunk/doc/counters.html。和 https://docs.sonarqube.org/latest/user-guide/metric-definitions 关于 SonarQube 显示的内容。指令覆盖范围仅在 JaCoCo 中提供。

    “lines”(SonarQube 截图中显示的“27.1%”)与“instructions”不同:单行代码通常包含许多字节码指令。因此,例如,如果您总共有 10 行中的 100 条指令,并且用 20 条指令覆盖 1 行,那么错过了 80% 的指令,但错过了 90% 的行。

    所以总而言之,没有差异,或者至少它没有显示在您的屏幕截图中。

    【讨论】:

    • 感谢您的回答。你能澄清一下吗?那么 Sonar 显示的 28% 覆盖率是多少?请注意声纳报告中 28.8% 的“覆盖率”。我不太明白它代表什么以及它与 jacoco 报告有何关系。分支覆盖是我应该关注的而不是错过的指令吗?
    • "28.8%" - 是线路覆盖率和分支覆盖率的混合,请参阅页面 docs.sonarqube.org/display/SONAR/Metric+Definitions 关于它的计算方式,JaCoCo 不计算这个。 “27.1%” - 是线路覆盖率,应该在 JaCoCo 报告中显示,但不会显示在您的屏幕截图中(例如,请参阅 eclemma.org/jacoco/trunk/coverage 的 5 列“missed/lines”)。 “担心的”?你的意思是?最初的问题是关于差异以及如何使用代码覆盖率指标是另一回事。 SonarQube 提供分支和线路的聚合,以简化同时监控两者。
    • 感谢您向我指出指标定义。这很有帮助。
    • sonarqube 指标定义链接似乎已损坏。这是一个工作链接:docs.sonarqube.org/latest/user-guide/metric-definitions
    猜你喜欢
    • 2019-12-27
    • 2018-07-27
    • 2018-05-07
    • 2016-02-25
    • 2018-12-29
    • 2023-03-27
    • 2017-10-01
    • 2017-03-31
    相关资源
    最近更新 更多