Эспрессо: как мне убивать приложение каждый раз перед началом теста

Я пишу тесты в kotlin, используя экспрессо, и когда я его запускаю, эспрессо, похоже, оставляет состояние приложения как есть, если тест не проходит или когда он переходит к следующему тесту. Я хочу сделать эти тесты независимыми, а не запускать их по порядку или реализовывать условие if в приемочных тестах. Поэтому я искал, как убить его так же, как приложение fullReset с возможностями в appium.

Я попытался использовать реализацию запуска тестов ORCHESTRATOR, но как только я поместил это в параметры теста gradle sync, и он показывает, что нет тестов для запуска, хотя у меня есть тег аннотации @Test, но как только я его удалю, я могу запустить тесты.

Я даже пытался поставить .edit() .clear() и .commit() в sharedpreference перед каждым тестом, но опять же это не поможет. Приложение возобновляет работу, а не перезапускается при запуске следующего теста.

А потом я снова попробовал Espresso.pressback(), но хотя это и происходит, приложение все равно только возобновляет


person Emjey    schedule 05.01.2020    source источник


Ответы (2)


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

class MyActivityTestRule : ActivityTestRule<MyActivity>(MyActivity::class.java, false, true) {

    val preferences = ApplicationProvider.getApplicationContext<Application>()
            .getSharedPreferences(NAME, MODE)
    // or getDefaultSharedPreferences(), depends on your app!

    override fun beforeActivityLaunched() {
        preferences.edit().clear().commit()
    }
}

Затем установите правило в своем тесте:

class MyTest {

    @get:Rule val myTestRule = MyActivityTestRule()

    // ...
}
person Aaron    schedule 06.01.2020
comment
Как мне импортировать ApplicationProvider - person Emjey; 06.01.2020
comment
Поскольку я использую Android, а не Androidx - person Emjey; 06.01.2020
comment
А как насчет InstrumentationRegistry.getInstrumentation().getTargetContext()? Это должно дать вам контекст приложения. - person Aaron; 07.01.2020
comment
Когда я применяю этот код, как только я подписываюсь, он снова перенаправляет меня обратно на вход. Так что похоже, что даже запуск этого пользовательского правила ActivityRule или установка очистки в @Before дает мне тот же результат, но, тем не менее, я не очищаю его в нужный момент, я думаю - person Emjey; 07.01.2020

testInstrumentationRunnerArguments clearPackageData: 'true' 

под defaultConfig в файле проекта, у меня работает.

Однако для этого требуется orchestrator, я предлагаю очистить и перестроить перед запуском теста.

Вот как я добавил оркестратор:

androidTestUtil 'androidx.test:orchestrator:1.1.0'

как зависимости

execution 'ANDROIDX_TEST_ORCHESTRATOR'

под тестовые варианты.

person Eliyahu Shwartz    schedule 09.01.2020
comment
Мой проект не в Androidx! - person Emjey; 09.01.2020
comment
Я не проверял это. но в основном это тот же «ANDROID_TEST_ORCHESTRATOR» для тестовых параметров и «com.android.support.test.orchestrator.1.0.2» для зависимостей - person Eliyahu Shwartz; 09.01.2020
comment
Позвольте мне проверить сейчас - person Emjey; 09.01.2020
comment
Представленное строковое обозначение модуля «com.android.support.test.orchestrator.1.0.2» недопустимо. Примеры обозначений: «org.gradle: gradle-core: 2.2», «org.mockito: mockito-core: 1.9.5: javadoc». - person Emjey; 09.01.2020
comment
Правильное использование: вместо . «com.android.support.test.orchestrator: 1.0.2» - person Eliyahu Shwartz; 09.01.2020
comment
Что-то нужно добавить внутри приложения? Could not resolve all files for configuration ':app:androidTestUtil'. Could not find com.android.support.test.orchestrator:1.0.2:. Required by: project :app - person Emjey; 09.01.2020
comment
Я предполагаю, что у вас уже есть repositories { mavenCentral()} в вашем проекте Gradle. Я не могу думать о чем-то другом.. - person Eliyahu Shwartz; 09.01.2020
comment
Давайте продолжим обсуждение в чате. - person Emjey; 09.01.2020
comment
Я продвинулся в этом, и теперь я получаю java.lang.Exception: попытка использовать AndroidJUnit4 со стандартным бегуном JUnit и бегуном делегата «org.robolectric.RobolectricTestRunner» не может быть загружена. Проверьте конфигурацию сборки. И когда я импортирую import androidx.test.runner.AndroidJUnit4, он говорит No instrumentation registered! Must run under a registering instrumentation. - person Emjey; 10.01.2020
comment
У нас была та же проблема со времени нашего последнего обсуждения, и мы попытались запустить тест с другим эмулятором, и проблема была решена. - person Eliyahu Shwartz; 22.01.2020
comment
Да! В итоге я провел еще один тест, чтобы начать как новый. У меня другая проблема. Удалось ли вам распределить тесты по устройствам в эспрессо? Я хочу распределить разные тесты по разным устройствам для сокращения времени выполнения. Ложка и фланг кажутся параллельными, выполняя все тесты только на всех устройствах, но не распределяя их. У вас есть что-нибудь по этому поводу? - person Emjey; 23.01.2020