Android Studio 3.0 gradle 3.0.0-beta2, breaks Kotlin Unit Test Coverage?
Asked Answered
F

1

13

I have a simple Kotlin classes, as below

class MyClass {
    fun justSayHello(yes: Boolean): String {
        if (yes) {
            return "Hello"
        } else {
            return "Sorry"
        }
    }
}

I have my test (written in Java here, could be in Kotlin, also)

public class MyClassTest {
    private MyClass myClass = new MyClass();

    @Test
    public void testFirst() {
        myClass.justSayHello(true);
    }

    @Test
    public void testSecond() {
        myClass.justSayHello(false);
    }
}

When I run a test with Coverage in Android Studio 3.0 Beta-2 using classpath 'com.android.tools.build:gradle:3.0.0-beta2', no coverage is reported for it.

But when I run the test using classpath 'com.android.tools.build:gradle:2.3.3', 100% coverage reported.

When I change my source code to Java:

public class MyClass {
    public String justSayHello(boolean yes) {
        if (yes) {
            return "Hello";
        } else {
            return "Sorry";
        }
    }
}

It works fine for both gradle build tools

It seems to me that 'com.android.tools.build:gradle:3.0.0-beta2' has the broken test coverage measurement for Kotlin.

Did I miss anything? Is there a workaround for me to get the test coverage in Kotlin?

Flog answered 22/8, 2017 at 13:56 Comment(3)
I reported the issue in issuetracker.google.com/issues/64929213Flog
Does this answer your question? JaCoCo returning 0% Coverage with Kotlin and Android 3.0Spermato
Another similar question: Android Studio 3/Kotlin code coverageSpermato
A
6

In case anyone is still looking for a solution, adding in a gradle task to copy the cases from the tmp directory into the directory that the coverage output looks in helps with this issue as a workaround.

For example add copyTestClasses to your module gradle file

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

And then setting up your defaults to run the gradle task before running the tests Example of setting up gradle task

It can help to find both of the directories in your project manually before trying to point to them using gradle, to make sure that you're pointing to the right place (flavours will change the directories that you need to point to)

Alcahest answered 12/12, 2017 at 1:50 Comment(5)
This is as per reported in https://mcmap.net/q/410064/-android-studio-3-kotlin-code-coverage. But if observe carefully, it is reporting the coverage of the test code, not the app code. :(Flog
The reason that one is reporting the coverage of the test classes is because it's copying from /debugUnitTest and not /debugAlcahest
there is no debug folder if there is no kotlin classesAntiphon
Still the same with Android Studio 3.0.1, I filed a ticked: issuetracker.google.com/u/1/issues/73730680Harms
Also, if you use the module just as plain kotlin lib, use this instead: task copyTestClasses(type: Copy) { from "build/classes/kotlin" into "build/classes/java" }Censorious

© 2022 - 2024 — McMap. All rights reserved.