【问题标题】:Is it possible to analyze Android Kotlin code-coverage with SonarQube?是否可以使用 SonarQube 分析 Android Kotlin 代码覆盖率?
【发布时间】:2018-06-05 10:14:04
【问题描述】:

我已经配置了一个 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 Android 时是否可以使用 SonarQube 收集这些信息?

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

【问题讨论】:

  • 您找到解决方案了吗?我陷入了确切的问题,我得到了其他报告,但没有覆盖范围
  • @giroxiii 在发布问题后不久,我放弃了尝试使用 Sonar 获得 Kotlin 代码覆盖率的尝试。然而,我已经获得了许多使用 Java 和 JaCoCo 的项目。回顾一下我的 sonar.properties 文件,我可能已经能够通过在 sonar.properties 文件中添加以下行来引用 JaCoCo 任务的输出来解决此问题: ``` sonar.jacoco.reportPath=build/jacoco/ test.exec ``` 我不确定这是否适用于 Kotlin,但它有助于 Java 覆盖。我希望这会有所帮助,祝你好运!
  • 较新版本的 Sonarqube 有一个 Kotlin 插件,它与 Jacoco 插件集成并正确检测 Kotlin 项目。我已经修改了我的答案以反映这一点

标签: android jenkins sonarqube kotlin code-coverage


【解决方案1】:

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

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


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

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

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

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

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

【讨论】:

  • 我尝试将:'sonar.java.binaries=app/build' 更改为:'sonar.java.binaries=app/build/kotlin' 但不幸的是我仍然没有得到代码覆盖率......
  • 很遗憾,我不熟悉 Android 构建结构。这适用于 Gradle 4.4 和基于 JVM 的应用程序,但您使用的 Gradle 版本可能较旧,需要一个不同的目录作为“二进制”文件夹?还是 Android/Gradle 将类文件写入其他地方?
【解决方案2】:

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

然而,我已经获得了许多使用 Java 和 JaCoCo 的项目。

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

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

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

【讨论】:

    【解决方案3】:

    如果您使用的是 gradle 和 Jacoco。 您可以通过 xmlReportPaths 使用 Jacoco 进行代码覆盖。有了这个声纳就会相信 Jacoco 的输出。

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

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

    【讨论】:

      【解决方案4】:

      您可以安装一个 3rd-party Sonar 插件here,它将测量 Kotlin 项目的代码质量。不幸的是,截至本文发布时,SonarQube 还没有自己的插件。

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

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

      【讨论】:

      • 我们能够让 Sonar 使用 Detekt 插件检测 kotlin 代码覆盖率(以及其他代码分析),所以我可以说这种方法是当今要遵循的路径。
      猜你喜欢
      • 2016-07-08
      • 2016-04-08
      • 2020-08-07
      • 1970-01-01
      • 2018-01-11
      • 2017-07-28
      • 2021-06-04
      • 1970-01-01
      • 2014-03-08
      相关资源
      最近更新 更多