Empty Jacoco report for Android Espresso



我正在尝试使用Espresso测试为我的Android项目获得代码覆盖率。然而,雅可科给了我一份报告说我没有报道任何事情。我做了一个演示程序来突出我的问题,在这里。

如果你不想去Github查看项目,这里是构建。gradle文件:

apply plugin: 'com.android.application'
apply plugin: 'jacoco'
android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"
    defaultConfig {
        applicationId "ninja.bryansills.jacocotest"
        minSdkVersion 16
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    packagingOptions {
        exclude 'LICENSE.txt'
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            testCoverageEnabled true
        }
    }
}
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.1.1'
    androidTestCompile 'com.android.support.test:runner:0.2'
    androidTestCompile 'com.android.support.test:rules:0.2'
    androidTestCompile 'com.android.support.test.espresso:espresso-core:2.1'
}

基于Ligol指出的问题,以下是对我有效的方法。

在androidTest中添加自定义测试运行器

package com.example;
import android.os.Bundle;
import android.support.test.runner.AndroidJUnitRunner;
import android.util.Log;
import java.lang.reflect.Method;
public class AndroidJacocoTestRunner extends AndroidJUnitRunner {
    static {
        System.setProperty("jacoco-agent.destfile", "/data/data/"+BuildConfig.APPLICATION_ID+"/coverage.ec");
    }
    @Override
    public void finish(int resultCode, Bundle results) {
        try {
            Class rt = Class.forName("org.jacoco.agent.rt.RT");
            Method getAgent = rt.getMethod("getAgent");
            Method dump = getAgent.getReturnType().getMethod("dump", boolean.class);
            Object agent = getAgent.invoke(null);
            dump.invoke(agent, false);
        } catch (Throwable e) {
            Log.d("JACOCO", e.getMessage());
        }
        super.finish(resultCode, results);
    }
}

在app/build.gradle

中使用这个测试运行器
android{
    ...
    defaultConfig {
      ....
      testInstrumentationRunner "com.example.AndroidJacocoTestRunner"
    }
}

您的问题可能与这个问题有关。

https://code.google.com/p/android/issues/detail?id=170607

我在三星设备上也有同样的问题,我没有改变任何东西,但换成HTC设备,我开始得到覆盖。三星的JaCoCo手机似乎有点不对劲。

我建议大家在生成覆盖率报告时不要使用三星设备。我尝试了所有方法来解决0覆盖问题,幸运的是,我把设备换成了红米Note 5 Pro,然后就开始显示覆盖了。在做了一些研究和阅读了一些文章后,我发现三星给用户使用其产品进行测试的自由较少。不过你也可以在三星设备上进行测试,

最新更新