Покрытие Kotlin Jacoco не отображается для статических методов (компаньон) в Android - PullRequest
0 голосов
/ 07 января 2019

Я реализовал Jacoco в своем проекте Android, используя следующий учебник https://proandroiddev.com/unified-code-coverage-for-android-revisited-44789c9b722f, чтобы охватить тестовое покрытие в классах kotlin.

По неизвестной причине он не сообщает о покрытии статических методов, объявленных в блоке Companion.

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

Однако, если я преобразую класс в экземпляр, а не в единичный объект, я смогу увидеть покрытие полностью нормально.

Кто-нибудь сталкивался с этой проблемой? а что ты делал?

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Я нашел причину проблемы, но пока не уверен, почему она возникла, мои правила исключений включают в себя больше правил, чем в предыдущем уроке, в другом уроке по jacoco для игнорирования автоматически сгенерированных файлов было предложено включить '**/*$*' как правило, как только я удалил его, он показал покрытие для статических методов в kotlin.

Мое понимание Jacoco, что эти правила игнорируют файлы и не будут отображать его в отчете, и до того, как я внес изменение, он показывал, что этот класс включен в покрытие теста ... это странно или я отсутствует фундаментальная вещь о том, как kotlin генерирует методы или как jacoco исключает правила?

В любом случае, я надеюсь, что это поможет ..

0 голосов
/ 07 января 2019

следующий учебник 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()

запуск виртуального устройства Pixel XL с API 28 и цель Android 9.0 (Google APIs) в только что загруженном Android Studio 3.2.1

и исполнение

./gradlew jacocoTestReport

следующий отчет создается в каталоге app/build/reports/jacoco/jacocoTestReport/html/, как и ожидалось

enter image description here

enter image description here

Учитывая количество факторов, которые влияют на результат (например, версии всех задействованных компонентов - Android SDK, Device, компилятор Kotlin, Gradle, JaCoCo и т. Д.), Попытки угадать, что отличается в вашем случае, являются контрпродуктивными для IMO, и так, что лучший совет - это провести очень тщательное сравнение различий между вашей настройкой и приведенным выше примером.


Обновление

Как выяснилось при сравнении @HeWhoProtects, проблема была в

исключение **/*$*

, что относится к исключению файлов классов из анализа. Один исходный файл может быть скомпилирован в несколько файлов классов, например, в случае вложенных классов в Java и точно в случае компаньона в Kotlin, и в обоих случаях имя класса и файл класса будут содержать $.

...