Разработка UI-тестов для Android-приложения (UI Automator)

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.
Разработка и поддержка любых видов мобильных приложений:
Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Предлагаемые услуги
Показано 1 из 1 услугВсе 1735 услуг
Разработка UI-тестов для Android-приложения (UI Automator)
Средняя
~3-5 рабочих дней
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    756
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    624
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1052
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    947
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    862
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    445

Разработка UI-тестов для Android-приложения (UI Automator)

UI Automator — это не замена Espresso. Это инструмент для другого класса задач: системные диалоги разрешений, переход между приложениями, уведомления в шторке, взаимодействие с клавиатурой на уровне IME. Espresso здесь просто не достанет — он ограничен одним процессом. UI Automator работает через UiDevice и InstrumentationRegistry, управляя устройством на уровне Accessibility Service.

Когда Espresso перестаёт работать

Типичный сценарий: приложение запрашивает разрешение на камеру через ActivityResultContracts.RequestPermission(). Диалог разрешения — это системный UI из другого процесса (com.android.permissioncontroller). Espresso падает с NoMatchingViewException, потому что не видит кнопку «Разрешить» за пределами своей иерархии View.

Другой случай — проверка поведения приложения при получении push-уведомления. Нужно опустить шторку, нажать на уведомление и проверить, что открылся правильный экран. Без UiDevice.openNotification() и UiScrollable это не написать.

Третий сценарий, который часто недооценивают: тестирование deep link из браузера. Пользователь нажимает ссылку в Chrome, Android показывает bottomsheet выбора приложения. UI Automator позволяет выбрать нужный вариант программно через UiSelector().text("Открыть в MyApp").

Как пишем тесты с UI Automator

Базовая архитектура теста строится на трёх объектах:

  • UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) — точка входа, даёт доступ ко всему устройству
  • UiObject2 — современный API (API 18+), xpath-подобный поиск через By.res(), By.text(), By.desc()
  • UiSelector + UiObject — старый API, но всё ещё нужен для UiScrollable

Пример обработки диалога разрешения:

val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
val allowButton = device.wait(
    Until.findObject(By.text("Разрешить").pkg("com.android.permissioncontroller")),
    3000
)
allowButton?.click() ?: fail("Permission dialog did not appear within 3s")

device.wait() с таймаутом — обязательно. Системные диалоги появляются асинхронно. Без ожидания тест нестабилен при разной загрузке CI-машины.

Работа с уведомлениями

device.openNotification()
device.wait(Until.hasObject(By.text("Новое сообщение")), 5000)
val notification = device.findObject(By.text("Новое сообщение"))
notification.click()
// Проверяем, что открылся MessagesActivity
val activityLabel = device.wait(Until.findObject(By.res("com.example.app:id/toolbar_title")), 3000)
assertThat(activityLabel?.text).isEqualTo("Сообщения")

Интеграция с Espresso

На практике тесты смешивают оба фреймворка: UI Automator для системных взаимодействий, Espresso для проверки UI внутри приложения. Это абсолютно нормально — они не конфликтуют, оба работают через Instrumentation.

// UI Automator: обрабатываем диалог ОС
device.findObject(By.text("Разрешить")).click()

// Espresso: проверяем состояние внутри приложения
onView(withId(R.id.cameraPreview)).check(matches(isDisplayed()))

Нестабильность тестов — главная проблема

Flaky tests на UI Automator встречаются чаще, чем на Espresso. Причин несколько:

Системные анимации. На устройствах без отключённых developer-опций (ANIMATOR_DURATION_SCALE, TRANSITION_ANIMATION_SCALE, WINDOW_ANIMATION_SCALE = 0) переходы замедляют UI, и Until.findObject() с коротким таймаутом проваливается. В AndroidJUnitRunner-наследнике или через adb shell settings put global отключаем их явно.

Разные прошивки. Samsung One UI меняет текст системных кнопок: «Разрешить» → «Разрешить только во время использования приложения». By.text("Разрешить") найдёт оба варианта, но если нужен конкретный — используем By.textStartsWith() или By.textContains().

Очерёдность уведомлений. В шторке может быть несколько уведомлений. Используем By.res() с package-квалификатором, а не By.text() по тексту уведомления, который может совпасть с другим.

Структура проекта

UI Automator тесты живут в androidTest/ рядом с Espresso. В build.gradle.kts:

androidTestImplementation("androidx.test.uiautomator:uiautomator:2.3.0")
androidTestImplementation("androidx.test:runner:1.5.2")
androidTestImplementation("androidx.test:rules:1.5.0")

Версия uiautomator:2.3.0 — актуальная, с поддержкой BySelector и UiObject2. Старая com.android.support.test.uiautomator:uiautomator-v18 устарела.

Запуск через Fastlane или Gradle:

./gradlew connectedAndroidTest -Pandroid.testInstrumentationRunnerArguments.class=com.example.SystemPermissionsTest

Что входит в работу

  • Написание тестов для системных диалогов (разрешения, выбор приложения, Intent Chooser)
  • Тесты уведомлений: появление, свайп, тап, deep link
  • Тесты межприложенческих сценариев (share, open in, clipboard)
  • Интеграция с существующими Espresso-тестами
  • Настройка запуска в CI (GitHub Actions / GitLab CI / Bitbucket Pipelines)
  • Отключение системных анимаций для стабильного прогона

Сроки

3–5 дней в зависимости от количества системных сценариев. Простой набор (2–3 диалога разрешений + уведомления) — 3 дня. Сложные межприложенческие сценарии с несколькими флоу — 5 дней. Стоимость рассчитывается индивидуально после анализа требований.