Android Sonarqube的总体覆盖范围与jacoco报告覆盖范围不匹配

Android Sonarqube的总体覆盖范围与jacoco报告覆盖范围不匹配,android,sonarqube,code-coverage,jacoco,Android,Sonarqube,Code Coverage,Jacoco,我有一个多模块的Android项目,我看到jacoco报告的内容和Sonarqube报告的内容之间存在差异。 该项目也是一个多风格的项目,可以生成许多不同的变体。我正在使用帮助我生成所有任务。这些任务为每个变量生成单独的报告 当我运行我的jacoco报告时,我看到: 当我运行声纳扫描仪时,我看到: 我的项目中有一些例外情况,但即使没有它们,覆盖范围%s也不匹配 我觉得我可能没有提供与中暗示的相同的字节码 以下是我的相关信息: 声纳5.6版 渐变跑步者 plugins { id "org.so

我有一个多模块的Android项目,我看到jacoco报告的内容和Sonarqube报告的内容之间存在差异。 该项目也是一个多风格的项目,可以生成许多不同的变体。我正在使用帮助我生成所有任务。这些任务为每个变量生成单独的报告

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

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

我的项目中有一些例外情况,但即使没有它们,覆盖范围%s也不匹配

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

以下是我的相关信息: 声纳5.6版

渐变跑步者

plugins { id "org.sonarqube" version "2.0.1" }
声纳配置:(在root build.gradle上)

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

Jacoco配置打开(app/build.gradle)


据我所知,分支机构的覆盖率是一样的:两种情况下都有40%,15%未覆盖

而将“指令”(如JaCoCo报告截图所示)与其他任何东西进行比较就像是比较苹果和橙子——它们并不代表相同的东西。请参阅关于JaCoCo提供的计数器。还有关于SonarQube的表演。说明仅在JaCoCo中提供

“行”(“SonarQube屏幕截图中显示的27.1%”)与“指令”不同:一行代码通常包含许多字节码指令。例如,如果总共有10行100条指令,其中一行包含20条指令,那么遗漏的指令占80%,但遗漏的指令占90%


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

谢谢您的回答。你能澄清一下吗?那么声纳显示的28%覆盖率是多少?注意声纳报告上28.8%的覆盖率。我不太明白这代表了什么,以及它与jacoco报告的关系。分支机构覆盖率是我应该关注的,而不是遗漏指示吗?“28.8%”-是行覆盖率和分支机构覆盖率的混合,请参见如何计算的页面,JaCoCo不计算这一点。“27.1%”是行覆盖率,应在JaCoCo报告中显示,但不显示在屏幕截图上(例如,请参见第页的5列“遗漏/行”)。“担心”?什么意思?最初的问题是关于差异,如何使用代码覆盖率度量则是另一回事。SonarQube提供分支和行的聚合,以同时简化对两者的监控。感谢您为我指出度量定义。这很有帮助。
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"
    }
}
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

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