能否使用SonarQube分析Android Kotlin代码覆盖率?

6
我已经配置了一个Jenkins项目,它在gradle构建和测试后,调用"执行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,其中包括度量项:Bugs、Vulnerabilities、Debt、Code Smells和Duplications。但是,在这份报告中没有任何地方定义由测试覆盖的代码。SonarQube成功运行了Kotlin插件并看到了代码库本身,但未确定覆盖率。在使用Kotlin Android时,是否有可能使用SonarQube收集此信息?
我尝试安装Jacoco,但在SonarQube结果中没有看到任何新数据。

你找到解决方案了吗?我卡在同样的问题上,我得到了其他报告,但没有覆盖率。 - giroxiii
@giroxiii 我在发布问题后不久就放弃了尝试使用Sonar获取Kotlin代码覆盖率。但是,我已经成功地让许多项目与Java和JaCoCo一起工作。回顾我的sonar.properties文件,我可能可以通过添加以下行引用JaCoCo任务的输出来修复这个问题:sonar.jacoco.reportPath=build/jacoco/test.exec我不确定这是否适用于Kotlin,但它对Java覆盖率有所帮助。希望这可以帮助到你,祝你好运! - Don
Sonarqube的新版本有一个Kotlin插件,可以与Jacoco插件集成,并正确检测Kotlin项目。我已经修改了我的答案以反映这一点。 - Mikezx6r
4个回答

1
您可以安装第三方Sonar插件这里,以测量Kotlin项目的代码质量。不幸的是,截至本帖发布时,SonarQube没有自己的插件。
一旦设置完成,请参考这里设置gradle和sonar-project.properties。这篇文章有点过时,但包含了一个更新版本的链接,仍然是一个很好的起点。
#2的TL;DR:SonarQube需要的Kotlin信息位于两个地方。其中一个已经被OP确认。另一个位于app/build/tmp/kotlin-classes中。

我们已经成功让Sonar检测Kotlin代码覆盖率(以及其他代码分析),使用Detekt插件,因此我可以说这种方法是现在应该采用的路径。 - giroxiii

1
如果您正在使用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 插件 的文档。它还可以处理混合源代码(Java、Kotlin)。


0

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

然而,我已经成功地让许多Java和JaCoCo项目运行。

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

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

我不确定这个方法是否适用于Kotlin,但它可以提高Java的覆盖率并解决我的使用情况。


0

最新版本的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'但不幸的是,我仍然没有得到代码覆盖率... - Don
1
很遗憾,我不熟悉Android的构建结构。这适用于Gradle 4.4和基于JVM的应用程序,但是你使用的Gradle版本可能较旧,需要将“binaries”文件夹作为不同的目录?或者Android / Gradle将类文件写在其他地方? - Mikezx6r

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接