Android Espresso: Выполнение нескольких тестов последовательно

Я пытаюсь запустить серию тестов с помощью Espresso для Android. Похоже, что между прогонами действия НЕ закрываются. Независимо от состояния приложения после одного теста, его осталось для следующего теста.

Мне нужно запустить каждый из моих тестов из нового запуска приложения. В Robotium это обрабатывается с помощью solo.finishOpenedActivites() в методе tearDown().
http://robotium.googlecode.com/svn/doc/com/robotium/solo/Solo.html#finishOpenedActivities()

Как это можно сделать с помощью Espresso?

Ответ 1

Проблема с предоставленным исправлением в отчете об ошибке заключается в том, что это будет выполняться только при завершении всего пакета. Если вы хотите иметь чистый стек действий после каждого теста, вам нужно вручную что-то сделать. Я написал небольшой класс, который делает почти то же самое, что и исправление вышеупомянутого билета, но может быть выполнено в любой момент времени.

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();
            }
        }
    }
}

Ответ 2

Решение Себастьяна Грёблера прекрасно работает. Тем не менее, библиотеки были переименованы в последнюю тестовую библиотеку 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();
            }
        }
    }
}

Ответ 3

GoogleInstrumentation фактически пытается завершить все открытые действия, но не делает это должным образом из-за глупой ошибки: https://code.google.com/p/android-test-kit/issues/detail?id=66

Патч, связанный с проблемой, устраняет эту проблему.