是否可以使用 SonarQube 分析 Android Kotlin 代码覆盖率?

Is it possible to analyze Android Kotlin code-coverage with SonarQube?

我已经配置了一个 Jenkins 项目,在 gradle 构建和测试之后,调用具有以下规范的 "Execute SonarQube Scanner":

sonar.projectKey=my_project_key
sonar.projectName=my_Android
sonar.projectVersion=1.0
sonar.sources=app/src
sonar.java.binaries=app/build/intermediates/classes/debug
sonar.coverage.exclusions=app/src/test/**,app/src/androidTest/**,app/src/main/res/**

这成功运行了 SonarQube 并向 IPaddress:9000 生成了一份报告,该报告衡量了:错误、漏洞、债务、代码味道和重复,就像它应该的那样。但是,此报告中没有地方定义测试所涵盖的代码。 SonarQube 是 运行 Kotlin 插件成功并看到代码库本身,但没有确定覆盖率。使用 Kotlin 时是否可以使用 SonarQube 收集此信息 Android?

我确实尝试安装 Jacoco,但没有在 SonarQube 结果中看到任何新数据。

较新版本的 Sonarqube (6+) 现在原生支持 Kotlin,不需要在您的项目中进行任何自定义配置。

只需确保安装了 Kotlin 和 Jacoco 插件,它应该适合您。


--- 旧答案--------------------------------

我的项目使用 Jacoco 生成覆盖率报告。 要让 SonarQube 获取结果,请尝试设置以下内容:

sonar.java.binaries={$buildDir}/classes/kotlin 

换句话说,让 SonarQube 知道 Kotlin class 文件在哪里。

此配置假设一个 100% Kotlin 项目。如果您的项目混合了 Java 和 Kotlin,那么您必须确定如何配置这两个目录。

您可以安装第 3 方 Sonar 插件 here 来衡量 Kotlin 项目的代码质量。不幸的是,截至 posting,SonarQube 没有自己的插件。

设置完成后,查看 here 以设置 gradle 和 sonar-project.properties。 post 有点过时,但包含更新版本的 link,仍然是一个很好的起点。

TL;#2 的 DR:Kotlin 所需的 SonarQube 信息位于 2 个位置。 OP 已经确定了一个。另一个位于 app/build/tmp/kotlin-classes.

我在发布问题后不久就放弃了使用 Sonar 获取 Kotlin 代码覆盖率的尝试。

但是,我有很多项目可以使用 Java 和 JaCoCo。

回顾我的 sonar.properties 文件,我可能已经能够通过将以下行添加到 sonar.properties 文件来引用 JaCoCo 任务的输出来解决此问题:

sonar.jacoco.reportPath=build/jacoco/test.exec

我不确定这是否适用于 Kotlin,但它有助于 Java 覆盖并解决了我的用例。

如果您正在使用 gradle 和 Jacoco。 您可以将 Jacoco 用于 xmlReportPaths 的代码覆盖率。有了那个 Sonar 就会相信 Jacoco 的输出。

sonarqube {
    properties {
        property("sonar.java.coveragePlugin", "jacoco")
        property("sonar.coverage.jacoco.xmlReportPaths", "./build/reports/jacoco/test/jacocoTestReport.xml")
    }
}

来自 Sonar + Jacoco Plugin 的文档。 它还适用于混合源代码(Java、Kotlin)。