Android: Espresso не дожидается появления фрагмента или активности, поэтому все тесты не пройдены.

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

Я попытался использовать Espresso для создания UI-Test для приложения для Android. После решения проблем с зависимостями (потому что некоторые библиотеки включены два раза в разные версии в качестве зависимости от других библиотек) я все еще не могу создавать рабочие тесты ...

Я знаю об IdlingResource, но пока я читал, эспрессо ждет "из коробки", пока основной поток и AsyncTaskPool не перейдут в режим ожидания, прежде чем запускать какие-либо тесты.

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

 new Handler().postDelayed(new Runnable() {
   @Override
   public void run() {
     finish();
     Intent intent = new Intent(SplashScreenActivity.this, MainActivity.class);
     startActivity(intent);
   }
 }, 3000);

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

Тест только проверяет, отображается ли TextView, содержащий определенный текст, в представлении:

onView(withText("DummyText")).check(matches(notNullValue()));

Я подумал, что создать простой тест будет не так уж и сложно ...

Поскольку я должен протестировать api> = 16, мне нужен эспрессо. Только для себя я проверил это с помощью uiAutomator (я знаю, что это для api> = 18), но есть такая умная логика, чтобы ждать, пока что-то будет показано ... и это отлично работает ...


person Thomas Cirksena    schedule 17.02.2016    source источник


Ответы (1)


Какое у вас правило активности? Потому что, если это SplashScreenActivity, тест начнется немедленно, и onView завершится ошибкой, если представление не находится на экране-заставке. Попробуйте открыть непосредственно MainActivity, чтобы проверить это представление. Я использую Espresso в течение некоторого времени и знаю, что методы @Test запускаются, когда действие, определенное как ActivityTestRule, завершает загрузку.

Надеюсь, это помогло.

Удачи!

person sunlover3    schedule 18.02.2016
comment
Спасибо за ваш совет! У меня все заработало после того, как я объявил третий параметр правила как 'false': @Rule public ActivityTestRule<MainActivity> mMainActivity = new ActivityTestRule<>(SplascreenActivity.class, true, false); Сделав это, я могу определить поведение, например, doNothing().when(mDeviceService).getDevices();, а затем запустите действие вручную с помощью mSplashscreenActivity.launchActivity(null);. Я также изменил Handler на AsyncTask и знаю, что тест работает, как ожидалось, включая ожидание, проверку и т. Д. - person Thomas Cirksena; 01.03.2016
comment
Действительно удивительным! Молодец! - person sunlover3; 01.03.2016
comment
@grumpyshoe Я также сталкиваюсь с той же проблемой. В моем приложении у нас есть экран-заставка, который автоматически переводит пользователя на экран входа в систему, но мой тест не ждет, чтобы перейти к входу в систему и начать поиск текста редактирования ввода имени пользователя. Не могли бы вы мне помочь. - person Krishnakant; 20.09.2016
comment
Есть еще какое-нибудь решение для этого? У меня такая же проблема! - person Tobias Reich; 16.11.2016
comment
Может быть, это кому-то поможет: мое решение - использовать CountingIdlingResource. Я также изменил шаблон проектирования на MVVM, и эта комбинация работает хорошо. - person Thomas Cirksena; 25.01.2017