Android Espresso 的空 Jacoco 报告
Empty Jacoco report for Android Espresso
我正在尝试使用 Espresso 测试获取我的 Android 项目的代码覆盖率。然而,Jacoco 给我回了一份报告,说我没有涵盖任何内容。我做了一个演示应用程序来突出我的问题,那就是 here。
如果你不想去Github看项目,这里是build.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"
}
}
我在 Samsung 设备上遇到了同样的问题,我没有做任何更改,而是改为 HTC 设备 我开始收到 coverage.ec JaCoCo Samsung 设备似乎有问题。
我建议大家在生成覆盖率报告时不要使用三星设备。我尝试了所有方法来解决 0 覆盖问题,幸运的是将我的设备更改为 Redmi Note 5 Pro,瞧,覆盖开始显示。
在做一些研究和阅读一些文章时,我发现三星给用户较少的自由来使用他们的产品进行测试。虽然您可以在 Samsung 设备上进行 root 后的测试。
我正在尝试使用 Espresso 测试获取我的 Android 项目的代码覆盖率。然而,Jacoco 给我回了一份报告,说我没有涵盖任何内容。我做了一个演示应用程序来突出我的问题,那就是 here。
如果你不想去Github看项目,这里是build.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"
}
}
我在 Samsung 设备上遇到了同样的问题,我没有做任何更改,而是改为 HTC 设备 我开始收到 coverage.ec JaCoCo Samsung 设备似乎有问题。
我建议大家在生成覆盖率报告时不要使用三星设备。我尝试了所有方法来解决 0 覆盖问题,幸运的是将我的设备更改为 Redmi Note 5 Pro,瞧,覆盖开始显示。 在做一些研究和阅读一些文章时,我发现三星给用户较少的自由来使用他们的产品进行测试。虽然您可以在 Samsung 设备上进行 root 后的测试。