【问题标题】:Kotlin Jacoco coverage not showing for static methods (companion) in AndroidKotlin Jacoco 覆盖未显示 Android 中的静态方法(伴侣)
【发布时间】:2019-01-07 13:33:02
【问题描述】:

我使用以下教程 https://proandroiddev.com/unified-code-coverage-for-android-revisited-44789c9b722f 在我的 Android 项目中实现了 Jacoco,以满足 kotlin 类中的测试覆盖率。

由于某些未知原因,它没有报告在 Companion 块下声明的静态方法的覆盖率。

class Meh {
    companion object {
     fun test () {
     // logic to test
     }
}

但是,如果我将类转换为实例而不是单例,我可以完全看到覆盖范围。

有人遇到过这个问题吗?你做了什么?

【问题讨论】:

    标签: android unit-testing kotlin code-coverage jacoco


    【解决方案1】:

    以下教程https://proandroiddev.com/unified-code-coverage-for-android-revisited-44789c9b722f

    在从同一个教程中克隆示例后,以今天的状态 (HEAD commit)

    git clone https://github.com/rafaeltoledo/unified-code-coverage-android.git
    cd unified-code-coverage-android
    git checkout kotlin-coverage
    

    将伴随对象添加到MainActivity

     class MainActivity : AppCompatActivity() {
    
    +    companion object {
    +      fun executed() {
    +      }
    +
    +      fun notExecuted() {
    +      }
    +    }
    +
         override fun onCreate(savedInstanceState: Bundle?) {
             super.onCreate(savedInstanceState)
             setContentView(R.layout.activity_main)
    
    +        executed()
    

    使用 API 28 启动虚拟设备 Pixel XL 和新下载的 Android Studio 3.2.1 中的目标 Android 9.0 (Google APIs)

    和执行

    ./gradlew jacocoTestReport
    

    以下报告按预期在目录app/build/reports/jacoco/jacocoTestReport/html/ 中生成

    考虑到影响结果的因素的数量(例如所有相关组件的版本 - Android SDK、设备、Kotlin 编译器、Gradle、JaCoCo 等),尝试猜测您的情况有什么不同会适得其反,因此,最好的建议是对您的设置与上述示例之间的差异进行非常仔细的比较。


    更新

    正如@HeWhoProtects 在比较过程中发现的那样,问题出在

    排除**/*$*

    指的是从分析中排除类文件。单个源文件可以编译成多个类文件,例如在 Java 中嵌套类的情况下,以及在 Kotlin 中的伴侣的情况下,在这两种情况下,类和类文件的名称都将包含 $

    【讨论】:

      【解决方案2】:

      我找到了问题的原因,但还不确定为什么会导致它,我的排除规则包含的规则比上面教程中的规则更多,在不同的 jacoco 忽略自动生成文件的教程中,建议包含 @987654321 @ 作为规则,一旦我删除它,它就会显示对 kotlin 中静态方法的覆盖。

      我对 Jacoco 的理解是,这些规则会忽略文件并且不会在报告中显示它,并且在我进行更改之前,它表明该类已包含在测试覆盖范围内……这很奇怪还是我缺少关于 kotlin 如何生成方法或 jacoco 排除规则如何工作的基本知识?

      无论如何我希望这会有所帮助..

      【讨论】:

      • 您可能指的是排除和包含 class 文件或类,这与 source 文件不同 - 单个源文件可以编译成多个类文件,例如在 Java 中的嵌套类和 Kotlin 中的伴侣的情况下,在这两种情况下,类和类文件的名称都将包含 $
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-21
      • 2010-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多