Как использовать ресурс эспрессо на холостом ходу

Сценарий: когда пользователь нажимает кнопку «Загрузить», данные (музыка/изображение и т. д.) начинают загружаться из Интернета. Когда загрузка завершена, кнопка меняет текст метки на «Открыть». Затем пользователь нажимает на эту кнопку «Открыть». То, что я сделал, это:

onView(allOf(withId(R.id.button),withText("Download"))).check(matches(isClickable())).perform(click());
try {
    Thread.sleep(delayedTime);
} catch (InterruptedException e) {
    e.printStackTrace();
}
onView(allOf(withId(R.id.button),withText("Open"))).check(matches(isClickable())).perform(click());

Иногда тест проходит, иногда нет. Причина, по которой иногда это не удается, заключается в том, что "No views in hierarchy found matching: (with id: something:id/button and with text: is "Open"). И я знаю, что использование Thread.sleep в Espresso также является плохой практикой. Я прочитал о Ресурс ожидания эспрессо, но для меня это не имеет смысла, и я не знаю, как я могу применить это в данном конкретном случае.


person Great Question    schedule 26.01.2015    source источник
comment
Для ThreadPools попробуйте использовать это: luongbui.com/thread-pool-idlingresource-for- эспрессо Я также привел полный пример, чтобы показать, как использовать мой IdlingResource, просто зарегистрируйте его и отмените регистрацию в тестовом коде. Имейте в виду, вам нужен тот же экземпляр ThreadPool, который вы используете в производственном коде. Настоятельно рекомендуется фабричный узор или кинжал.   -  person luong    schedule 27.02.2017


Ответы (1)


На самом деле ресурсы холостого хода - самые сложные моменты Эспрессо.

Вы должны реализовать это, если в вашем тесте вам нужно ждать/синхронизировать с какой-либо асинхронной фоновой задачей. По умолчанию Espresso ожидает завершения операций пользовательского интерфейса в текущей очереди сообщений и выполнения AsyncTasks по умолчанию (синхронизируется с пулом потоков AsyncTask по умолчанию), прежде чем перейти к следующей тестовой операции. Ознакомьтесь с этим для AsyncTasks. Однако, если вы запускаете другой поток, например, для связи с какой-либо веб-службой, вы должны использовать IdlingResource.

Любой Thread.sleep(), который вам может понадобиться, является сигналом того, что вам может понадобиться ресурс холостого хода.

Теперь о том, как написать ресурс холостого хода. Это легко может сделать разработчик кода, потому что они теперь знают, как они оценивают этот момент.

Предполагается, что это должно быть что-то вроде этого:

public class DownloadIdlingResource extends BaseIdlingResource { ... }

Предполагается определить, когда этот ресурс простаивает или нет.....

Тест, который хотел сказать Espresso, что ему нужно дождаться этого ресурса холостого хода, должен был определить во время инициализации тестового класса этот ресурс холостого хода (setUp() и т. д.) или активировать его при необходимости. Это означает, что вам есть что ждать, но оно еще не активировано. Например, бездействующий ресурс загрузки может иметь слушателя, чтобы установить бездействующий ресурс в состояние, отличное от бездействия (setIdle(false)), когда загрузка начинается, и возвращать его в состояние бездействия, когда оно завершено (setIdle(true)). Эспрессо продолжается всем остальным персоналом, если все простаивающие ресурсы простаивают (нечего ждать, чтобы закончить). Детали реализации ресурса бездействия сильно зависят от реализации приложения.

Что можно сказать о ресурсе холостого хода в целом:

  1. isIdleNow() реализовать логику, когда ресурс простаивает

  2. registerIdleTransitionCallback будет вызван Espresso, когда ресурс будет зарегистрирован, и даст вам ResourceCallback.

  3. Когда ресурс переходит из режима занятости в режим ожидания, на практике вы получаете обратный вызов от фоновой задачи о том, что операция завершена (данные карты были загружены или загрузка отменена), вы должны callonTransitionToIdle() на зарегистрированном ResourceCallback.

  4. В getName() вы должны вернуть имя ресурса, который используется для ведения журнала.

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

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

person Anna    schedule 26.01.2015