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

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

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

Как этого добиться с помощью эспрессо?


person SuperDeclarative    schedule 10.06.2014    source источник


Ответы (3)


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

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();
            }
        }
    }
}
person Sebastian Gröbler    schedule 18.07.2014
comment
где я должен назвать это? @После? - person urSus; 18.02.2016

Решение, написанное Себастьяном Грёблером, отлично работает. Тем не менее, в последних версиях Espresso и Android Test Library библиотеки были переименованы, здесь тот же класс, написанный для 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();
            }
        }
    }
}
person Sebas LG    schedule 19.09.2015
comment
Похоже, именно этот код попал в библиотеку поддержки тестирования Android: android.googlesource.com/platform/frameworks/testing/+/ - person tir38; 10.08.2016
comment
... который запускается автоматически перед каждым тестом. - person tir38; 10.08.2016

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

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

person haffax    schedule 12.06.2014
comment
Я вытащил исправление, но как его применить? - person SuperDeclarative; 16.06.2014
comment
К сожалению, не тривиально. Вытяните эспрессо, примените патч, если он не получен напрямую. Установив maven, вызовите «mvn install» из командной строки. Решайте проблемы по ходу дела. Вероятно, а) вам нужен mavenized android sdk, получите через github.com/mosabua/maven-android -sdk-deployer б) вам нужно деактивировать некоторые тесты, которые выполняются во время жизненного цикла maven, потому что Espresso не может успешно запускать свои собственные тесты за один запуск. - person haffax; 16.06.2014