Сброс состояния приложения между запусками InstrumentationTestCase

Один из моих QA-инженеров поддерживает приложение с довольно большой кодовой базой и множеством разных файлов SharedPreferences. Он пришел ко мне на днях с вопросом, как сбросить состояние приложения между тестовыми запусками, как будто оно было удалено-переустановлено.

Не похоже, что это поддерживается ни Espresso (который он использует), ни тестовой средой Android изначально, поэтому я не уверен, что ему сказать. Наличие собственного метода для очистки всех различных файлов SharedPreferences было бы довольно хрупким решением.

Как можно сбросить состояние приложения во время инструментирования?


person Turnsole    schedule 02.06.2016    source источник
comment
Здесь упоминается лучшее решение: stackoverflow.com/a/57461180/94557   -  person Matt Wolfe    schedule 25.10.2019


Ответы (3)


Текущий эспрессо не предоставляет никакого механизма для сброса состояния приложения. Но для каждого аспекта (pref, db, файлы, разрешения) существует решение.

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

@Rule
public ActivityTestRule<Activity> activityTestRule = new ActivityTestRule<>(Activity.class, false, false);

А позже начните свою деятельность с

activityTestRule.launchActivity(null)

Для сброса настроек вы можете использовать следующий фрагмент (перед началом вашей деятельности)

File root = InstrumentationRegistry.getTargetContext().getFilesDir().getParentFile();
String[] sharedPreferencesFileNames = new File(root, "shared_prefs").list();
for (String fileName : sharedPreferencesFileNames) {
    InstrumentationRegistry.getTargetContext().getSharedPreferences(fileName.replace(".xml", ""), Context.MODE_PRIVATE).edit().clear().commit();
}

Вы также можете сбросить настройки после начала своей деятельности. Но тогда активность, возможно, уже прочитала предпочтения.

Ваш класс приложения запускается только один раз и уже запущен, прежде чем вы сможете сбросить настройки.

Я начал писать библиотеку, которая должна упростить тестирование с помощью espresso и uiautomator. Сюда входят инструменты для сброса данных приложения. https://github.com/nenick/espresso-macchiato См., например, EspAppDataTool с методами для очистка настроек, баз данных, кэшированных файлов и сохраненных файлов.

person nenick    schedule 03.06.2016
comment
В проекте используется множество различных файлов SharedPreferences. Как я уже сказал, наличие собственного метода для очистки всех различных файлов SharedPreferences было бы довольно ненадежным решением. :( - person Turnsole; 08.06.2016
comment
Это равно, если у вас есть один или 9999 tausend SharedPreferences. Обычно все они находятся в файле shared_prefs. Что еще вы ожидаете? В качестве альтернативы вы можете написать сценарий для запуска каждого теста отдельно, между каждым тестом очищать данные приложения с помощью adb, а затем запускать следующий тест. - person nenick; 08.06.2016
comment
Ой! Я вижу что ты тут делал. Я прочитал это слишком быстро и понял, что shared_prefs — это сокращение от your_pref_file_name_here, но это буквально корневая папка файлов SharedPreferences. - person Turnsole; 08.06.2016
comment
Не могли бы вы просто использовать Instrumentation.getTargetContext().deleteSharedPreferences(...)? - person Adam Burley; 28.07.2021

Улучшая решение @nenick, инкапсулируйте поведение очистки состояния в пользовательском файле ActivityTestRule. Если вы сделаете это, вы можете разрешить тесту продолжать автоматически запускать активность без вашего вмешательства. С пользовательским ActivityTestRule активность уже находится в желаемом состоянии, когда она запускается для теста.

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

Ниже приведен пример, который я реализовал, чтобы убедиться, что приложение выходит из системы при запуске действия для каждого теста. Некоторые тесты, когда они терпели неудачу, оставляли приложение в состоянии входа. Это приведет к тому, что более поздние тесты также потерпят неудачу, потому что более поздние предполагали, что им нужно будет войти в систему, но приложение уже входило в систему.

public class SignedOutActivityTestRule<T extends Activity> extends ActivityTestRule<T> {

    public SignedOutActivityTestRule(Class<T> activityClass) {
        super(activityClass);
    }

    @Override
    protected void beforeActivityLaunched() {
        super.beforeActivityLaunched();
        InstrumentationRegistry.getTargetContext()
                .getSharedPreferences(
                        Authentication.SHARED_PREFERENCES_NAME,
                        Context.MODE_PRIVATE)
                .edit()
                .remove(Authentication.KEY_SECRET)
                .remove(Authentication.KEY_USER_ID)
                .apply();
    }

}
person Julian A.    schedule 23.01.2018

ты можешь попробовать

testInstrumentationRunnerArguments clearPackageData: 'true'
person Dana    schedule 27.07.2021