Jacoco сообщает об 0 охвате классов Kotlin модульными тестами, в Android-проекте

Я использую Android Gradle Plugin 3.0.0.

Я переношу приложение Android из java в kotlin. Мое приложение имеет классы в Java и Kotlin, а тесты – на Java.

Я запускаю ./gradlew clean jacocoTestReport .

Это выполняется как модульные тесты ( src/test ), так и контрольные тесты ( src/androidTest ).

Отчет, подготовленный jacoco в app/build/reports/jacoco/jacocoTestReport/html/index.html , не показывает охват классов Kotlin, которые действительно охватываются модульными тестами.

Отчет действительно показывает покрытие правильно с контрольно-измерительных испытаний.

Примечание. Я столкнулся с этими другими вопросами, которые не совсем то же самое:

  • JaCoCo возвращает 0%. Покрытие с Kotlin и Android 3.0 имеет проблемы с охватом кода с помощью контрольно-измерительных тестов, а не модульных тестов.
  • Android Studio JaCoCo сообщает, что у 0% покрытия есть проблема с охватом кода изнутри Android Studio, но не с учетом Kotlin.

Соответствующие части build.gradle моего модуля приложения:

 apply plugin: 'jacoco' apply plugin: 'kotlin-android' apply plugin: 'kotlin-kapt' ... android { defaultConfig { sourceSets { main.java.srcDirs += "$projectDir/src/main/kotlin" } } testOptions { unitTests { all { jvmArgs '-noverify', '-ea' } includeAndroidResources = true } } } dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" .... } jacoco { toolVersion '0.7.9' } task jacocoTestReport(type: JacocoReport, dependsOn: ["testDebugUnitTest", "createDebugCoverageReport"]) { reports { html.enabled = true } classDirectories = fileTree( dir: "${buildDir}", includes: ["tmp/kotlin-classes/debug/ca/rmen/android/poetassistant/**/*.class", "intermediates/classes/debug/ca/rmen/android/poetassistant/**/*.class"], excludes: ["**/R.class", "**/R*.class", "**/Manifest.class", "**/Manifest*.class", "**/BuildConfig.class", // ignore databinding generated code: "**/ca/rmen/android/poetassistant/databinding/*.class", ... other excludes ... "**/ca/rmen/android/poetassistant/BR.class", "**/com/android/**/*.class"]) sourceDirectories = files("${project.projectDir}/src/main/java", "${project.projectDir}/src/main/kotlin") executionData = fileTree( dir: "${buildDir}", includes: [ "jacoco/testDebugUnitTest.exec", "outputs/code-coverage/connected/*coverage.ec" ]) } 

Мне пришлось добавить includeNoLocationClasses = true в мой файл gradle следующим образом, чтобы отчет jacoco отражал охват классов Kotlin модульными тестами:

 android { testOptions { unitTests { all { jvmArgs '-noverify', '-ea' jacoco { includeNoLocationClasses = true } } includeAndroidResources = true } } } 

Примечание. Это решение работает для запуска тестов из командной строки, но я все равно получаю 0% покрытия при работе с покрытием изнутри Android Studio.