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

标签 android sonarqube code-coverage jacoco

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

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

jacoco report

当我运行 Sonar 扫描仪时,我看到了: sonar coverage report

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

我觉得我可能没有提供与 this question: 中暗示的相同字节码

这是我的相关信息: Sonar 版本 5.6。

Gradle 赛跑者

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

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

Sonar 配置(在 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关于 JaCoCo 提供的计数器。和 https://docs.sonarqube.org/latest/user-guide/metric-definitions关于 SonarQube 显示的内容。指令覆盖仅在 JaCoCo 中呈现。

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

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

关于android - Sonarqube 整体覆盖范围与 jacoco 报告覆盖范围不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40226859/

相关文章:

android - 如何让 Android 设备在 root 设备上进入休眠模式(比如,点击按钮)

python - 在 gitlab-ci 中运行 Sonar 扫描仪

java - SONAR Violation IllegalType,为什么修复它很重要?

java - 代码覆盖率中应该包含注释吗?

android - Android Studio 1.4代码覆盖率

php - 当一个表中的数据库中不存在行时,如何插入记录

android - MainActivity NoClassDefFoundError

symfony1 - 从PHPUnit代码覆盖范围强制排除文件

java - 错误httpclient在没有线程的情况下运行

java - Sonar : method length, 条件运算符