Эспрессо-тест проходит индивидуально, не проходит при запуске в комплекте

У меня есть следующий тест эспрессо. Он всегда проходит, если я запускаю его сам, но всегда терпит неудачу, когда я запускаю все тесты в классе вместе.

Что еще немного странно, так это то, что он работал даже как часть пакета. Я не уверен, почему теперь это перестало работать. Это должно быть что-то, что я сделал, но я не знаю что.

@Test
public void itemHasImage_ShowsImage() {
    closeSoftKeyboard();
    if (mItem.getImageUrl() != null) {
        onView(withId(R.id.edit_item_image)).perform(scrollTo())
            .check(matches(isDisplayed()));
    }
}

Я получаю ошибку:

Error performing 'scroll to'...
...
Caused by: java.lang.RuntimeException: Action will not be performed
because the target view does not match one or more of the following
constraints:(view has effective visibility=VISIBLE and is descendant
of a: (is assignable from class: class android.widget.ScrollView...

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

Когда он доходит до этого теста (в комплекте), он просто не прокручивается. Но когда я запускаю его сам, он просто прокручивается.

В другом вопросе о переполнении стека, который я недавно задал Espresso, не запускающем Activity, то же самое для второй итерации в параметризованном тесте, я обнаружил, что onDestroy из предыдущего теста вызывается после onResume в текущем тесте, в результате чего ему присваивается значение null и происходит сбой. тест. Опять же в этой ситуации проблема заключалась в том, что тест прошел сам по себе, но не в комплекте. У меня сейчас похожая проблема, но нет очевидного способа ее исправить. (Edit: обходной путь для другого вопроса больше не может быть применен).

Любые идеи кто-нибудь? Может ли это быть как-то неправильно прочитано? Как, может быть, он смотрит на тот из предыдущего теста. Это звучит смешно, но после той последней проблемы, которая у меня была, это кажется возможным.

Редактировать: Хорошо, получается, что при запуске этого теста как части набора изображение фактически не видно, что приводит к сбою теста. Я нашел это, используя отладчик и прокручивая представление вручную. Но почему?


Я думаю, что это ошибка, и я зарегистрировал проблему здесь:

https://code.google.com/p/android/issues/detail?id=235247

2 ответа

Он может быть в состоянии решить с помощью библиотеки утилит тестирования Orchestrator android, он будет выполнять каждый тестовый пример независимо, поэтому нет шансов на взлом в тестовом наборе

  • При использовании AndroidJUnitRunner версии 1.0 или выше у вас есть доступ к инструменту Android Test Orchestrator, который позволяет вам запускать каждый из тестов вашего приложения в рамках его собственного вызова Instrumentation.

Включение с помощью build.gradle

    android {
  defaultConfig {
   ...
   testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
 }

  testOptions {
    execution 'ANDROID_TEST_ORCHESTRATOR'
  }
}

dependencies {
  androidTestImplementation 'com.android.support.test:runner:1.0.1'
  androidTestUtil 'com.android.support.test:orchestrator:1.0.1'
}

Для получения дополнительной информации: https://developer.android.com/training/testing/junit-runner.html

У меня была похожая проблема, но причина была в другом, предложение @Rakshith-Kumar об использовании Orchestrator могло бы сработать, также решение каждого метода тестирования в TestSuite также могло бы стать решением, поскольку проблему можно устранить, выполнив каждый тест по отдельности.

Также стоит упомянуть, что если вы тестируете компонент, который использует планировщики RxJava (например, io scheduler) для запуска некоторых задач в фоновом потоке, это может привести к ошибкам, поскольку Espresso не сможет синхронизироваться с фоновыми потоками.

Решением может быть внедрение ObservableTransformer для выполнения операций подписки и наблюдения. А для тестов эспрессо замените экземпляр ObservableTransformer другим, который использует Schedulers.from(AsyncTask.THREAD_POOL_EXECUTOR) для планировщика io. Что-то вроде того:

public <T> ObservableTransformer<T, T> ioTransformer() {
        return observable -> observable.subscribeOn(AsyncTask.THREAD_POOL_EXECUTOR).observeOn(AndroidSchedulers.mainThread());
    }

Таким образом, эспрессо может синхронизироваться с фоновыми потоками и избегать нестабильности. Дополнительная информация: https://blog.danlew.net/2015/03/02/dont-break-the-chain/ https://developer.android.com/training/testing/espresso/

Другие вопросы по тегам