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

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

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 - тоже плохая практика. Я читал о Espresso Idling Resource, но для меня это не имеет смысла, и я не знаю, как я могу применить это в этом конкретном случае.

Ответ 1

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

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

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

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

Предполагается что-то вроде этого:

public class DownloadIdlingResource extends BaseIdlingResource { ....}

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

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

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

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

2) registerIdleTransitionCallback будет вызываться Espresso при регистрации ресурса и даст вам ResourceCallback.

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

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

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

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