Android Espresso:按顺序运行多个测试

Android Espresso:按顺序运行多个测试,android,testing,android-testing,android-espresso,Android,Testing,Android Testing,Android Espresso,我正在尝试使用安卓浓缩咖啡进行一系列测试。运行之间的活动似乎未关闭。无论应用程序在一次测试后的状态如何,都将留给下一次测试 我需要从一个新的应用程序开始运行我的每个测试。在Robotium中,这是使用tearDown()方法中的solo.finishOpenedActivites()处理的。 用浓缩咖啡怎么能做到这一点呢?Google Instrumentation实际上试图完成所有打开的活动,但由于一个愚蠢的错误而未能正确完成: 问题中链接的修补程序修复了此问题。错误报告中提供的修复程序的问

我正在尝试使用安卓浓缩咖啡进行一系列测试。运行之间的活动似乎未关闭。无论应用程序在一次测试后的状态如何,都将留给下一次测试

我需要从一个新的应用程序开始运行我的每个测试。在Robotium中,这是使用tearDown()方法中的solo.finishOpenedActivites()处理的。


用浓缩咖啡怎么能做到这一点呢?

Google Instrumentation实际上试图完成所有打开的活动,但由于一个愚蠢的错误而未能正确完成:


问题中链接的修补程序修复了此问题。

错误报告中提供的修复程序的问题是,这将仅在整个套件完成时执行。如果您想在每次测试后拥有一个干净的活动堆栈,您需要手动执行一些操作。我编写了一个小类,它的作用与上面提到的票据上的修复几乎相同,但可以在任何时间点执行

import android.app.Activity;
import android.os.Handler;
import android.os.Looper;
import com.google.android.apps.common.testing.testrunner.ActivityLifecycleMonitor;
import com.google.android.apps.common.testing.testrunner.ActivityLifecycleMonitorRegistry;
import com.google.android.apps.common.testing.testrunner.Stage;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.List;


public final class ActivityFinisher implements Runnable {

    public static void finishOpenActivities() {
        new Handler(Looper.getMainLooper()).post(new ActivityFinisher());
    }

    private ActivityLifecycleMonitor activityLifecycleMonitor;

    public ActivityFinisher() {
        this.activityLifecycleMonitor = ActivityLifecycleMonitorRegistry.getInstance();
    }

    @Override
    public void run() {
        final List<Activity> activities = new ArrayList<Activity>();

        for (final Stage stage : EnumSet.range(Stage.CREATED, Stage.STOPPED)) {
            activities.addAll(activityLifecycleMonitor.getActivitiesInStage(stage));
        }

        for (final Activity activity : activities) {
            if (!activity.isFinishing()) {
                activity.finish();
            }
        }
    }
}
导入android.app.Activity;
导入android.os.Handler;
导入android.os.Looper;
导入com.google.android.apps.common.testing.testrunner.ActivityLifecycleMonitor;
导入com.google.android.apps.common.testing.testrunner.ActivityLifecycleMonitorRegistry;
导入com.google.android.apps.common.testing.testrunner.Stage;
导入java.util.ArrayList;
导入java.util.EnumSet;
导入java.util.List;
公共最终类ActivityFinisher实现Runnable{
公共静态无效权限(){
新处理程序(Looper.getMainLooper()).post(新ActivityFinisher());
}
私人活动LifecycleMonitor活动LifecycleMonitor;
公共活动终结者(){
this.activityLifecycleMonitor=ActivityLifecycleMonitorRegistry.getInstance();
}
@凌驾
公开募捐{
最终列表活动=新建ArrayList();
for(最终阶段阶段:EnumSet.range(Stage.CREATED,Stage.STOPPED)){
activities.addAll(activityLifecycleMonitor.getActivitiesInStage(stage));
}
用于(最终活动:活动){
如果(!activity.isFinishing()){
activity.finish();
}
}
}
}

塞巴斯蒂安·格布勒(Sebastian Gröbler)编写的解决方案非常有效。 尽管如此,这些库在最新的Espresso和Android测试库中被重命名,这里是为Espresso 2.x编写的同一个类

import android.app.Activity;
import android.os.Handler;
import android.os.Looper;
import android.support.test.runner.lifecycle.ActivityLifecycleMonitor;
import android.support.test.runner.lifecycle.ActivityLifecycleMonitorRegistry;
import android.support.test.runner.lifecycle.Stage;

import java.util.ArrayList;
import java.util.EnumSet;
import java.util.List;


public final class ActivityFinisher implements Runnable {

    public static void finishOpenActivities() {
        new Handler(Looper.getMainLooper()).post(new ActivityFinisher());
    }

    private final ActivityLifecycleMonitor activityLifecycleMonitor;

    private ActivityFinisher() {
        this.activityLifecycleMonitor = ActivityLifecycleMonitorRegistry.getInstance();
    }

    @Override
    public void run() {
        final List<Activity> activities = new ArrayList<Activity>();

        for (final Stage stage : EnumSet.range(Stage.CREATED, Stage.STOPPED)) {
            activities.addAll(activityLifecycleMonitor.getActivitiesInStage(stage));
        }

        for (final Activity activity : activities) {
            if (!activity.isFinishing()) {
                activity.finish();
            }
        }
    }
}
导入android.app.Activity;
导入android.os.Handler;
导入android.os.Looper;
导入android.support.test.runner.lifecycle.ActivityLifecycleMonitor;
导入android.support.test.runner.lifecycle.ActivityLifecycleMonitorRegistry;
导入android.support.test.runner.lifecycle.Stage;
导入java.util.ArrayList;
导入java.util.EnumSet;
导入java.util.List;
公共最终类ActivityFinisher实现Runnable{
公共静态无效权限(){
新处理程序(Looper.getMainLooper()).post(新ActivityFinisher());
}
私人最终活动LifecycleMonitor活动LifecycleMonitor;
私人活动完成器(){
this.activityLifecycleMonitor=ActivityLifecycleMonitorRegistry.getInstance();
}
@凌驾
公开募捐{
最终列表活动=新建ArrayList();
for(最终阶段阶段:EnumSet.range(Stage.CREATED,Stage.STOPPED)){
activities.addAll(activityLifecycleMonitor.getActivitiesInStage(stage));
}
用于(最终活动:活动){
如果(!activity.isFinishing()){
activity.finish();
}
}
}
}

我提出了修复方案,但如何应用该修复方案呢?遗憾的是,这并非小事。拉浓咖啡,如果不是直接取的话涂上贴片。安装maven后,从命令行调用“mvn安装”。边走边解决问题。可能a)您需要mavenized android sdk,通过b)您需要停用在maven生命周期中运行的一些测试,因为令人放心的是,Espresso无法在一次运行中成功运行自己的测试。我应该将其称为何处@之后?看起来这段代码进入了Android测试支持库:。。。在每次测试前自动运行。