Sonarqube 整体覆盖范围与 jacoco 报告覆盖范围不匹配

Sonarqube overall coverage does not match jacoco report coverage

我有一个 multi-module Android 项目,我发现 jacoco 报告的覆盖范围与 Sonarqube 报告的覆盖范围之间存在差异。 该项目也是一个 multi-flavor 项目,会生成很多不同的变体。我正在使用 this plugin 来帮助我生成所有任务。这些任务为每个变体生成单独的报告。

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

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

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

我觉得我提供的字节码可能与 this question:

中提示的相同

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

Gradle 运行纳尔

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

Sonar 配置:(在根 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
}

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

“说明”(如 JaCoCo 报告的屏幕截图所示)与其他任何内容的比较就像苹果和橙子的比较——它们并不代表相同的东西。请参阅 http://www.eclemma.org/jacoco/trunk/doc/counters.html about counters that JaCoCo provides. And https://docs.sonarqube.org/latest/user-guide/metric-definitions 了解 SonarQube 显示的内容。指令覆盖仅在 JaCoCo 中呈现。

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

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