Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android studio code coverage not showing any Kotlin classes

I have 2 Kotlin based AS projects. One works fine, the other doesn't. Both have an identical structure and gradle config. I'm using Kotlin 1.1.4-2 with AS 3.0b2.

The problem is that when I run code coverage, the classes I'm testing do not even show up under the coverage report. The only thing I see is R.java and BuildConfig.java, but none of my source files are being found.

All source files are Kotlin based. I'm using Spek for my unit testing. Same setup and versions as my other functional project. I tried using both JaCoCo and Jetbrains code coverage and neither works.

I apologize, I'm not able to embed pictures yet.

This is the problem:

coverage report

Here's my project structure:

file structure

And here's my gradle android block:

compileSdkVersion 26
buildToolsVersion "26.0.1"

defaultConfig {
    minSdkVersion 16
    targetSdkVersion 26
    versionCode 1
    versionName libraryVersion
}

buildTypes {
    debug {
        testCoverageEnabled = true
    }
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

and my dependencies:

implementation fileTree(dir: 'libs', include: ['*.jar'])

implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
implementation "io.reactivex.rxjava2:rxkotlin:2.1.0"

testImplementation 'junit:junit:4.12'
testImplementation "org.jetbrains.kotlin:kotlin-test:$kotlin_version"
testImplementation 'org.jetbrains.spek:spek-api:1.1.2'
testImplementation 'org.jetbrains.spek:spek-junit-platform-engine:1.1.2'
testImplementation 'org.junit.platform:junit-platform-runner:1.0.0-M4'
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.0.0-M4'

implementation 'com.android.support:appcompat-v7:26.0.1'

implementation 'com.squareup.okhttp3:okhttp-ws:3.3.1'
implementation 'com.google.protobuf:protobuf-java:2.6.1'

I've tried running

task copyTestClasses(type: Copy) {
  from "build/tmp/kotlin-classes/debugUnitTest"
  into "build/intermediates/classes/debug"
}

task copySdkClasses(type: Copy) {
  from "build/tmp/kotlin-classes/debug"
  into "build/intermediates/classes/debug"
}

before my testing and that doesn't work either.

What's strange is my other project, using the same AS version, Kotlin version, and project structure, is working fine and generating proper code coverage.

Any help would be appreciated.

like image 288
Chris Dowd Avatar asked Aug 22 '17 19:08

Chris Dowd


People also ask

How do I get code coverage on Android?

You can check the code coverage report of your instrumented and unit tests locally. For your instrumented test, locate your Android studio projects folder in your system. Then navigate to your project folder: _(CodeCoverageExample) > app > build > reports > androidTests > connected > flavors > debugAndroidTest > Index.

Can I run kotlin in Android Studio?

Android Studio provides full support for Kotlin, enabling you to add Kotlin files to your existing project and convert Java language code to Kotlin. You can then use all of Android Studio's existing tools with your Kotlin code, including autocomplete, lint checking, refactoring, debugging, and more.


Video Answer


2 Answers

Try to use JaCoco for coverage, this is a IntelliJ IDEA issue: Kotlin inline keyword causing IntelliJ IDEA Coverage reporting 0%

How to use JaCoco to get the coverage: Making Android Studio Test Coverage works

Resume:

  1. Click on edit configurations

Edit configurations

  1. Go to Run/Debug Configurations -> Defaults -> Android JUnit -> Code Coverage

Code coverage configuration

  1. Choose coverage Runner: Select JaCoCo

  2. Apply -> OK

  3. Run your test again and voila you will get the coverage

like image 178
Andres David serrano Avatar answered Sep 27 '22 20:09

Andres David serrano


Kotlin announced the new kotlinx-kover Gradle plugin compatible with JaCoCo and IntelliJ.
It resolves the problem with inline functions and maybe more.

plugins {
     id("org.jetbrains.kotlinx.kover") version "0.5.0"
}

Once applied, the plugin can be used out of the box without additional configuration.

Watch its YouTube announcement video and also track its roadmap from this youtrack issue.

like image 24
Mahozad Avatar answered Sep 27 '22 18:09

Mahozad