В приложении я пишу тест пользовательского интерфейса Espresso для входа в приложение. Я написал тест, и он отлично работает, но у меня есть один случай, когда у меня возникла проблема.
В этом приложении пользователи иногда получают бонусы при открытии приложения (обычно нет, но это, скажем, сценарий 1:100) В этих ситуациях всплывающее окно появляется на экране, и мой тест завершается неудачей, потому что мой код пытается вызвать кнопку, которая не видна (она находится под всплывающим окном).
Я хотел бы написать if-else в тесте, где я могу, например, проверить видимость всплывающей кнопки закрытия. Поэтому, если это видно, нажмите на него, а если нет, продолжайте в обычном режиме.
Но я не нашел никакого синтаксиса if-else при тестировании пользовательского интерфейса. Может ли кто-нибудь, у кого больше опыта в тестировании эспрессо пользовательского интерфейса, помочь мне советом? Спасибо
Создайте два теста. Один, где бонусное всплывающее окно не может появиться, и тот, где бонусное всплывающее окно появляется всегда. Таким образом, можно проверить оба поведения.
Вы не должны ничего оставлять на волю случая, и ваша проблема как раз является примером того, почему бы и нет.
При каких условиях появляется наше всплывающее окно? Какой-то кусок кода должен это контролировать. разбить этот кусок кода на отдельный класс. Передайте этот класс в код, который выполняет пользовательский интерфейс. Затем вы можете издеваться над ним, чтобы делать именно то, что вы хотите для каждого тестового случая - показывать или не показывать.
Всплывающее окно зависит от бэкенда. Когда бэкэнд решает отправить бонус пользователю, мы проверяем это в приложении, и отображается всплывающее окно.
Чтобы добавить к ответу, цель тестирования — изучить конкретное поведение в коде. Ваша обязанность в начале теста состоит в том, чтобы настроить состояние кода в соответствии с вариантом использования. Таким образом, один вариант использования — вход без всплывающих окон; другой с всплывающим окном. Вам нужно два теста, чтобы подтвердить оба поведения. Если вы не можете установить состояние таким образом для теста, это может указывать на плохие шаблоны кодирования и варианты выбора. @GabeSechan дает представление о том, как это исправить. Что касается внутренних действий, вы можете создать макет или подделку, чтобы представить это поведение.
@Примож просто для подтверждения, так что нет возможности создать if-else в тестовом коде пользовательского интерфейса?
Я даже не пробовал делать if-else в тесте. Я предполагаю, что должно быть возможно что-то сделать с обычным if-else, но, вероятно, в структуре для этого нет ничего, потому что, как было объяснено в комментариях выше; это не то, как тест должен быть написан.
Спасибо. Ваш ответ принят
Я согласен с Primož, что у вас не должно быть неопределенного теста. Но, если это невозможно, вы всегда можете использовать try/catch с конкретным исключением, чтобы попытаться закрыть всплывающее окно перед тестом.
Что-то вроде этого может работать (возможно, потребуется настроить перехват в зависимости от точного исключения, если у вас нет всплывающего окна.
try {
onView(withId(R.android.foo)).perform(click())
} catch (e: NoSuchViewException) {
// code to be executed if view does not exist
}
Но всплывающее окно может появиться всегда. Это поведение приложения, всегда есть вероятность появления всплывающих окон на экране. Если я правильно понимаю вас, когда я запускаю эти тесты, один из них не пройдет, а другой пройдет, когда я проведу тестирование?