Kotlin Setup 的 Sonar Jacoco 不生成代码覆盖率

Posted

技术标签:

【中文标题】Kotlin Setup 的 Sonar Jacoco 不生成代码覆盖率【英文标题】:Sonar Jacoco for Kotlin Setup not generating code coverage 【发布时间】:2018-07-24 15:17:33 【问题描述】:

我正在尝试使用 Jacoco 为 Kotlin 进行声纳设置以生成代码覆盖率报告,但它没有显示任何代码覆盖率。在检查声纳控制台时,它显示以下错误。任何人以前都遇到过这个问题,任何可能遗漏的建议。

元信息

使用 sonarqube 版本“2.6.1”的插件

gradleVersion = '3.0.1'

kotlinVersion = '1.2.21'

Sonarqube 版本 = 版本 6.7.1(内部版本 35068)- LGPL v3

令人沮丧的是,我的设置项目生成空白代码覆盖率报告:(。PFA。

编辑:请找到项目结构快照。

我正在添加我用来生成声纳矩阵报告的声纳和 Jacoco gradle 文件设置。

这里是 sonar.gradle 文件:

sonarqube 

    properties 
        property "sonar.projectKey", "jacoco.sonar.test"
        property "sonar.projectName", "Sonar Jacoco Test"
        property "sonar.projectVersion", "1.1"

        property "sonar.java.source", "7"

        property "sonar.android.lint.report", "build/outputs/lint-results.xml"
        property "sonar.java.binaries", "build/tmp/kotlin-classes"
        property "sonar.java.test.binaries", "build/intermediates/classes/test/,build/tmp/kotlin-classes/devDebugUnitTest"
        property "sonar.tests","src/test/java"
        property "sonar.sources","src/main/java"
        property "sonar.java.coveragePlugin", "jacoco"
        property "sonar.jacoco.reportPaths","build/jacoco/testDevDebugUnitTest.exec"
        property "sonar.junit.reportsPath","build/test-results/testDevDebugUnitTest"
    

这里是 jacoco.gradle 文件

apply plugin: 'jacoco'

jacoco 
    toolVersion = "0.7.9"
    reportsDir = file("$project.projectDir/app/build/reports")


task jacocoTestReport(type: JacocoReport, dependsOn: "app:testDevDebugUnitTest") 
    group = "Reporting"

    reports 
        xml.enabled = true
        html.enabled = true
    

    def fileFilter = ['**/R.class',
                      '**/R$*.class',
                      '**/BuildConfig.*',
                      '**/*$ViewInjector*.*',
                      '**/*$ViewBinder*.*',
                      '**/*$MembersInjector*.*',
                      '**/Manifest*.*',
                      '**/*Test*.*',
                      'android/**/*.*']

    classDirectories = fileTree(
            dir: "$project.projectDir/app/build/intermediates/classes/dev",
            excludes: fileFilter
        ) + fileTree(
            dir: "$project.projectDir/app/build/tmp/kotlin-classes/devDebug",
            excludes: fileFilter
        )

    // sources
    sourceDirectories = files(["$project.projectDir/app/src/main/java"])
    executionData = files("$project.projectDir/app/build/jacoco/testDevDebugUnitTest.exec")

按照我用来生成 Jacobo 报告然后飙升报告的 gradle 命令。

./gradlew clean jacocoTestReport sonarqube

我观察到我得到的,一定是有一些路径。

未收集覆盖信息。也许你忘记包括 调试信息到编译的类?

对不起,如果这看起来有点长;但这是我发现的最好的总结在一个地方。另请注意,我尝试使用 Java 类而不是 Kotlin 进行类似设置,它正在生成具有代码覆盖率的报告。

【问题讨论】:

您能否edit您的问题包括您的SonarQube版本? 请检查您的 SonarQube 页面的页脚并添加您在那里找到的版本。我怀疑您标记为 SonarQube 版本的实际上是您的扫描仪版本。 您使用的是什么版本的 SonarJava?您在 Jacoco 报告上生成哪个版本? SonarJava 5.1 添加了对 jacoco 8.0 的支持 - 我不确定您正在生成什么版本,但这可能是相关的? 我正在使用:SQube:7.0,SRunner:3.0.3.778。 Jacoco 版本我没有明确提及,应该使用最新版本(即 jacoco-0.8.0)。 kotlin 源文件在哪里? 【参考方案1】:

您需要做一些事情才能使其适用于 kotlin。

确保您的声纳 > 7.5 如果您的 sonarqube 版本
plugins 
    id "jacoco"
    id "org.sonarqube" version "2.7.1"

关注这个网址:https://community.sonarsource.com/t/coverage-test-data-importing-jacoco-coverage-report-in-xml-format/12151

在您的 build.gradle 中添加属性以搜索 jacoco 结果。

property 'sonar.coverage.jacoco.xmlReportPaths', "$buildDir/reports/jacoco/test/jacocoTestReport.xml"

点击此网址获取属性:https://docs.sonarqube.org/7.5/analysis/analysis-parameters/

【讨论】:

感谢您的回复。我现在没有相同的设置来尝试这个。但是您是否可以创建和共享 repo 示例,以便其他人可以参考,这将有很大帮助。【参考方案2】:

如果您使用的是 android 测试编排器,这可能是问题所在。

我今天遇到了同样的问题,在禁用 android 测试编排器后,覆盖再次起作用。

错误报告:https://issuetracker.google.com/issues/72758547

我不确定如何配置 Android Kotlin 构建,但在我的 Android Java build.gradle 中,我不得不像这样注释掉测试编排器:

android 
...
    testOptions 
        // temporarily disable the orchestrator as this breaks coverage: https://issuetracker.google.com/issues/72758547
        //execution 'ANDROID_TEST_ORCHESTRATOR'
    ...
    

【讨论】:

不,我没有使用ANDROID_TEST_ORCHESTRATOR

以上是关于Kotlin Setup 的 Sonar Jacoco 不生成代码覆盖率的主要内容,如果未能解决你的问题,请参考以下文章

ANT 任务:使用 JaCoCo 的 SonarQube 扫描仪代码覆盖率报告

Kotlin、Java 8 和声纳覆盖率显示为 0

在Gradle中添加Dependency Check,以及在Sonar中查看报告

sonar-maven-plugin:如何在包含模式中使用项目相对路径?

SonarQube 不显示输出

SonarQube:如何抑制 Kotlin 代码中的警告