Писал ли UI тесты

Ответ

Да, писал UI-тесты с использованием Espresso и UI Automator. Espresso удобен для тестирования внутри приложения, а UI Automator — для кросс-приложенных сценариев.

Пример теста на Espresso:

@Test
fun loginButton_click_showsWelcomeMessage() {
    onView(withId(R.id.login_button)).perform(click())
    onView(withText("Welcome!")).check(matches(isDisplayed()))
}

Нюансы:

  • Тесты хрупкие из-за изменений в UI.
  • Требуют стабильного окружения (эмулятор/устройство).
  • Желательно использовать IdlingResource для асинхронных операций.

Для сложных сценариев комбинирую Espresso с MockWebServer для мокирования API.

Ответ 18+ 🔞

А, ну это когда ты пишешь тесты, которые реально кликают по экрану, как обезьяна с тачскрином. Да, работал и с Espresso, и с UI Automator. Это, блядь, две большие разницы, хотя оба про UI.

Espresso — это как хирургический инструмент для твоего же приложения. Точный, быстрый, но если ты вылезешь за его пределы — он просто разведёт руками. А UI Automator — это уже кувалда. Ему похуй, что ты тестируешь: твоё приложение, настройки системы или звонок какому-нибудь пидарасу. Он везде суётся.

Вот, смотри, простейший тест на Espresso, чтоб понять логику:

@Test
fun loginButton_click_showsWelcomeMessage() {
    onView(withId(R.id.login_button)).perform(click())
    onView(withText("Welcome!")).check(matches(isDisplayed()))
}

Выглядит просто, да? Нашёл кнопку по ID, кликнул, проверил, что текст "Welcome!" появился. Ебушки-воробушки, красота. Но тут-то и начинается пиздец.

Нюансы, от которых волосы дыбом:

  • Хрупкость, ёпта. Это главная беда. Дизайнер проснулся утром и решил, что кнопка login_button теперь должна называться sign_in_btn. Всё, твой тест накрылся медным тазом. Никакого логического развала — чисто косметика, а тесты посыпались. Подозрение ёбаное чувствую к каждому дизайнерскому обновлению.
  • Окружение должно быть стабильнее швейцарского банка. Если эмулятор тормозит, если анимация зависла, если где-то всплыло системное уведомление — тест может сломаться просто потому, что элемент не успел появиться. Терпения ноль, ёбать.
  • Асинхронщина — это ад. Ты кликнул на "логин", пошёл сетевой запрос, крутилка, и только потом появляется "Welcome!". Если не сказать Espresso "подожди, мудак", он тут же полезет искать текст, которого ещё нет, и обосрётся. Для этого нужны эти ваши IdlingResource. Без них — просто пипец.

Поэтому для сложных штук я часто комбинирую. Espresso для кликов внутри аппы, а чтобы не зависеть от бекенда, который может лежать, поднимаю MockWebServer. Это такая заглушка для API. Говоришь ей: "Слушай, на запрос /api/login всегда отдавай успех", и твои тесты гоняются в полной изоляции. Красота, а не жизнь.

А UI Automator — это когда надо проверить, что твоё приложение корректно открывает выбор фотки из галереи, или что пуш-уведомление действительно приходит. Короче, всё, что выходит за рамки одной песочницы. Инструмент грубый, но иногда без него — никуда.