Android 中的静态方法(伴侣)未显示 Kotlin Jacoco 覆盖率
Kotlin Jacoco coverage not showing for static methods (companion) in Android
我使用以下教程 https://proandroiddev.com/unified-code-coverage-for-android-revisited-44789c9b722f 在我的 Android 项目中实现了 Jacoco,以适应 kotlin classes 中的测试覆盖率。
由于某些未知原因,它没有报告在 Companion 块下声明的静态方法的覆盖率。
class Meh {
companion object {
fun test () {
// logic to test
}
}
但是,如果我将 class 转换为一个实例而不是一个单例,我就能完全看到覆盖率。
有人遇到过这个问题吗?你做了什么?
following tutorial 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()
在新下载的 Android Studio 3.2.1
中使用 API 28
和目标 Android 9.0 (Google APIs)
启动虚拟设备 Pixel XL
并执行
./gradlew jacocoTestReport
在目录 app/build/reports/jacoco/jacocoTestReport/html/
中按预期生成以下报告
鉴于影响结果的因素数量(例如所有相关组件的版本 - Android SDK、设备、Kotlin 编译器、Gradle、JaCoCo 等),尝试猜测你的情况有什么不同会适得其反,所以最好的建议是对你的设置和上面的例子之间的差异进行非常仔细的比较。
更新
正如@HeWhoProtects 在比较过程中发现的那样,问题出在
exclusion of **/*$*
指的是从分析中排除 class 文件。单个源文件可以编译成多个 class 文件,例如在 Java 中嵌套 classes 的情况下,以及在 Kotlin 中完全相同的情况下,在这两种情况下,class 和 class 文件的名称将包含 $
。
我找到了问题的原因,但还不确定为什么会导致它,我的排除规则包含的规则比上面教程中的规则多,在不同的忽略自动生成文件的jacoco教程中,建议包括'**/*$*'
通常,我一删除它,它就显示了对 kotlin 中静态方法的覆盖。
我对 Jacoco 的理解是这些规则会忽略文件并且不会在报告中显示出来,而在我进行更改之前,它显示这个 class 已包含在测试覆盖范围中....这很奇怪还是我错过了关于 kotlin 如何生成方法或 jacoco 如何排除规则的基本知识?
无论如何,我希望这对您有所帮助..
我使用以下教程 https://proandroiddev.com/unified-code-coverage-for-android-revisited-44789c9b722f 在我的 Android 项目中实现了 Jacoco,以适应 kotlin classes 中的测试覆盖率。
由于某些未知原因,它没有报告在 Companion 块下声明的静态方法的覆盖率。
class Meh {
companion object {
fun test () {
// logic to test
}
}
但是,如果我将 class 转换为一个实例而不是一个单例,我就能完全看到覆盖率。
有人遇到过这个问题吗?你做了什么?
following tutorial 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()
在新下载的 Android Studio 3.2.1
28
和目标 Android 9.0 (Google APIs)
启动虚拟设备 Pixel XL
并执行
./gradlew jacocoTestReport
在目录 app/build/reports/jacoco/jacocoTestReport/html/
中按预期生成以下报告
鉴于影响结果的因素数量(例如所有相关组件的版本 - Android SDK、设备、Kotlin 编译器、Gradle、JaCoCo 等),尝试猜测你的情况有什么不同会适得其反,所以最好的建议是对你的设置和上面的例子之间的差异进行非常仔细的比较。
更新
正如@HeWhoProtects 在比较过程中发现的那样,问题出在
exclusion of
**/*$*
指的是从分析中排除 class 文件。单个源文件可以编译成多个 class 文件,例如在 Java 中嵌套 classes 的情况下,以及在 Kotlin 中完全相同的情况下,在这两种情况下,class 和 class 文件的名称将包含 $
。
我找到了问题的原因,但还不确定为什么会导致它,我的排除规则包含的规则比上面教程中的规则多,在不同的忽略自动生成文件的jacoco教程中,建议包括'**/*$*'
通常,我一删除它,它就显示了对 kotlin 中静态方法的覆盖。
我对 Jacoco 的理解是这些规则会忽略文件并且不会在报告中显示出来,而在我进行更改之前,它显示这个 class 已包含在测试覆盖范围中....这很奇怪还是我错过了关于 kotlin 如何生成方法或 jacoco 如何排除规则的基本知识?
无论如何,我希望这对您有所帮助..