QA-инженер запускает тест на Android-эмуляторе - всё зелёное. Тот же сценарий на Samsung Galaxy S21 - приложение падает при открытии камеры. Баг существовал месяцами, но ни разу не всплыл в CI/CD, потому что пайплайн гонял тесты только на виртуальных машинах.
Выбор среды для мобильного тестирования - не технический каприз, а решение с реальными последствиями. Эмулятор экономит время и деньги, но пропускает целый класс дефектов. Физическое устройство ловит то, что виртуальная среда никогда не воспроизведёт, но требует инфраструктуры и обслуживания. Облачный device farm даёт компромисс, но у него своя цена и свои ограничения.
В этой статье разберём, какие баги находят только на железе, как устроены разные подходы к организации среды, когда виртуализация полностью закрывает задачу, а когда без реального устройства тест не считается пройденным.
Коротко:
- Эмулятор подходит для функциональных проверок, юнит-тестов и быстрого smoke в CI/CD - он дешевле и воспроизводим.
- Физическое устройство нужно для проверки камеры, Bluetooth, NFC, GPS, сенсоров, производительности и поведения при реальных условиях сети.
- Целый класс багов - жесты, рендеринг на конкретных GPU, поведение при входящем звонке - воспроизводится только на железе.
- Device farm (облачный или локальный) решает проблему покрытия устройств без содержания парка.
- Appium работает с обоими вариантами, но конфигурация и стабильность тестов на реальном устройстве отличаются.
- Оптимальная стратегия - гибридная: эмулятор в CI, железо для релизных и исследовательских прогонов.
Чем эмулятор отличается от симулятора
Прежде чем сравнивать подходы, важно разделить два понятия, которые часто путают. Эмулятор (Android Emulator в Android Studio) воспроизводит аппаратную архитектуру устройства программно - он исполняет тот же ARM-код, что и реальный телефон. Симулятор (iOS Simulator в Xcode) не эмулирует железо: он запускает iOS-приложение скомпилированным под архитектуру Mac, имитируя только поведение системы.
Это различие влияет на практику. iOS Simulator быстрее запускается и потребляет меньше ресурсов, но некоторые системные API в нём просто недоступны - например, Push Notifications через APNs, CoreBluetooth в полном объёме, ARKit. Android Emulator ближе к реальному железу, но всё равно не воспроизводит аппаратные сенсоры, радиомодули и специфику конкретных производителей.
Дальше в статье под словом «эмулятор» подразумеваются оба варианта виртуальной среды - и Android AVD, и iOS Simulator - если не указано иное.
Что эмулятор делает хорошо
Виртуальная среда выигрывает там, где нужна скорость, воспроизводимость и масштаб.
CI/CD-пайплайн. Эмулятор запускается из командной строки, не требует физического подключения и легко параллелится. Десять виртуальных устройств на одном сервере - норма. Десять физических телефонов на том же сервере - уже инфраструктурная задача.
Функциональные и регрессионные тесты. Если сценарий проверяет бизнес-логику - авторизацию, корзину, фильтры, формы - эмулятор справляется так же хорошо, как железо. Разница в поведении минимальна.
Быстрый smoke перед мержем. Прогнать 50 базовых сценариев за 8 минут на эмуляторе реальнее, чем ждать очереди к физическому устройству в device farm.
Отладка и воспроизведение багов. Эмулятор позволяет заморозить состояние, откатиться к снапшоту, запустить с конкретными параметрами сети или батареи через AVD Manager. На реальном телефоне это сложнее.
Покрытие версий ОС. Проверить поведение на Android 10, 12 и 14 одновременно - на эмуляторе это вопрос минут. Содержать три физических устройства с разными версиями - уже бюджет.
Баги, которые живут только на железе
Это ключевой раздел для тех, кто думает, что эмулятора достаточно. Есть целый класс дефектов, которые виртуальная среда просто не воспроизводит.
Камера и медиа. Эмулятор имитирует камеру через статичное изображение или видеофайл. Реальные баги - задержка фокусировки, некорректная ориентация фото на конкретных моделях, падение при переключении между фронтальной и основной камерой - появляются только на железе.
Bluetooth и NFC. В эмуляторе эти интерфейсы либо недоступны, либо работают через эмуляцию без реального стека. Приложения для платёжных терминалов, умных замков, медицинских устройств обязательно проверяются на физическом железе.
GPS и геолокация. Координаты можно подать через mock location, но поведение при потере сигнала, переключении между GPS и сетевой геолокацией, работа в фоне - всё это требует реального устройства на улице или хотя бы с отключённым Wi-Fi.
Производительность и тепловой троттлинг. Эмулятор работает на мощном сервере и не перегревается. Реальный бюджетный телефон через 10 минут нагрузки начинает снижать частоту процессора. Анимации дёргаются, скроллинг тормозит - и это баг, который пользователь увидит, а эмулятор скроет.
Жесты и тач-события. Мультитач, свайп с определённым давлением, долгое нажатие - поведение на реальном экране отличается от того, что симулирует Appium через UIAutomator2. Особенно это заметно в играх и приложениях с кастомными жестами.
Рендеринг на конкретных GPU. Samsung, Xiaomi и OnePlus используют разные GPU и драйверы. Градиенты, тени, анимации на WebView могут выглядеть иначе или вовсе ломаться на конкретном чипсете. Эмулятор использует программный рендеринг или GPU хост-машины - это другая картина.
Системные прерывания. Входящий звонок, push-уведомление от другого приложения, переход в режим энергосбережения - всё это прерывает пользовательский сценарий. Проверить, как приложение восстанавливается после такого прерывания, можно только на живом устройстве.
Специфика производителей. MIUI, One UI, EMUI - каждая оболочка добавляет свои ограничения на фоновые процессы, уведомления, разрешения. Приложение, которое отлично работает на чистом Android, может молча умирать в фоне на Xiaomi из-за агрессивного battery manager.
Важно: если приложение использует хотя бы одну из этих возможностей - камеру, геолокацию, Bluetooth, NFC, биометрию - релиз без проверки на физических устройствах является осознанным риском, а не экономией.
Сравнение подходов: когда что выбирать
| Сценарий | Эмулятор/симулятор | Реальное устройство |
|---|---|---|
| Smoke-тесты в CI/CD | Оптимально | Избыточно |
| Функциональная регрессия | Подходит | Подходит |
| Камера, Bluetooth, NFC, GPS | Не подходит | Обязательно |
| Производительность и FPS | Ненадёжно | Обязательно |
| Проверка на конкретных моделях | Не подходит | Обязательно |
| Отладка и воспроизведение бага | Удобнее | Когда баг только на железе |
| Проверка версий ОС | Удобнее | Для критичных версий |
| Исследовательское тестирование | Ограниченно | Предпочтительно |
Как организовать среду: три модели
Локальный парк устройств
Команда покупает и обслуживает физические телефоны самостоятельно. Устройства подключены к Mac Mini или Linux-серверу через USB, Appium-сервер поднят локально.
Плюсы: полный контроль, нет зависимости от внешних сервисов, можно тестировать без интернета, дешевле при большом объёме тестов.
Минусы: нужен человек, который следит за состоянием устройств. Телефоны разряжаются, зависают, требуют обновлений. Масштабировать сложно - каждое новое устройство это физический объект, который нужно купить, настроить и поддерживать.
Подходит командам с устойчивым набором целевых устройств и выделенным инженером по инфраструктуре.
Облачный device farm
Сервисы вроде BrowserStack, LambdaTest, AWS Device Farm или Firebase Test Lab предоставляют доступ к сотням реальных устройств через API и веб-интерфейс. Appium-тесты запускаются на удалённом железе, результаты приходят с видеозаписью и логами.
BrowserStack - наиболее зрелый игрок с широким парком устройств (более 3000 реальных телефонов и планшетов), хорошей интеграцией с CI/CD и детальными логами. Цена выше, чем у конкурентов.
LambdaTest - более доступный по цене, активно развивается, есть поддержка Appium и интеграция с популярными CI-системами. Парк устройств меньше, но для большинства проектов достаточен.
AWS Device Farm - хороший выбор, если инфраструктура уже на AWS. Поддерживает Appium, XCUITest, Espresso. Ценообразование по минутам использования.
Firebase Test Lab - бесплатный лимит для небольших команд, хорошая интеграция с Android-экосистемой, поддержка Robo-тестов (автоматический обход приложения без написания тестов).
Пример сравнения BrowserStack и LambdaTest: если команда запускает 200 минут тестов в день на 5 устройствах, BrowserStack обойдётся дороже, но даст более стабильное соединение и подробные HAR-логи сети. LambdaTest закроет ту же задачу дешевле, но иногда с более длинными очередями на популярные устройства. Для стартапа с ограниченным бюджетом LambdaTest - разумный старт.
Гибридная модель
Эмулятор в CI для быстрых прогонов + облачный farm для релизных прогонов + 2-3 физических устройства в офисе для исследовательского тестирования и воспроизведения специфических багов.
Это наиболее распространённая модель в командах среднего размера. Она балансирует скорость, стоимость и глубину покрытия.
Настройка Appium для работы с реальным устройством
Запустить Appium на эмуляторе проще - он автоматически обнаруживается через ADB. С физическим устройством есть нюансы.
Android:
- Включить режим разработчика на устройстве (7 нажатий на «Номер сборки» в настройках).
- Включить «Отладку по USB» и при необходимости «Отладку по Wi-Fi» (Android 11+).
- Подключить устройство, подтвердить доверие к компьютеру.
- Проверить через
adb devices- устройство должно отображаться со статусомdevice, а неunauthorized. - В Appium Desired Capabilities указать
udidконкретного устройства,platformVersionиdeviceName.
iOS (реальное устройство): требует Apple Developer Account, provisioning profile и подписанной сборки. Это существенно сложнее, чем запуск на симуляторе. Без платного аккаунта разработчика автоматизацию на реальном iPhone не запустить.
Частая проблема при работе с физическими устройствами через Appium - нестабильность соединения. Устройство может зависнуть, USB-соединение оборваться, сессия не завершиться корректно. Для локального парка помогает watchdog-скрипт, который перезапускает зависшие сессии и проверяет состояние устройств перед запуском тестов.
Совет по конфигурации: при работе с несколькими физическими устройствами одновременно указывайте udid явно в каждой сессии. Если udid не задан, Appium может подключиться к любому доступному устройству - это ломает параллельные прогоны.
Типичные ошибки при выборе и настройке среды
Тестировать только на флагманах. Samsung Galaxy S24 и iPhone 15 Pro - не репрезентативная выборка. Значительная часть аудитории использует бюджетные устройства с 3 ГБ RAM, медленным процессором и старой версией Android. Баги производительности и рендеринга живут именно там.
Считать зелёный эмулятор достаточным для релиза. Это ошибка, которая регулярно приводит к инцидентам. Эмулятор не заменяет проверку на железе - он её дополняет.
Не учитывать версию WebDriver и Appium. Appium 2.x изменил архитектуру плагинов и драйверов. Конфигурация, которая работала с Appium 1.x, может не работать с новой версией. Перед настройкой среды проверьте совместимость: документация Appium содержит матрицу совместимости драйверов.
Игнорировать состояние устройств в локальном парке. Телефон с 10% зарядки, переполненной памятью или включённым режимом «Не беспокоить» даст нестабильные результаты. Перед прогоном нужна проверка: заряд выше 80%, свободное место есть, все лишние приложения закрыты.
Не изолировать тестовые данные между устройствами. Если несколько тестов пишут в одну учётную запись на разных устройствах параллельно, они будут мешать друг другу. Каждое устройство должно работать со своим набором тестовых данных.
Выбирать облачный farm только по цене. Дешёвый сервис с нестабильными устройствами и плохими логами потратит больше времени команды на разбор «флапающих» тестов, чем сэкономит денег.
Чеклист перед запуском тестов на физическом устройстве
- Устройство отображается в
adb devicesсо статусомdevice - Заряд батареи выше 80% (или устройство подключено к питанию)
- Свободное место на устройстве - не менее 500 МБ
- Режим «Не беспокоить» и автоповорот экрана отключены
- Приложение установлено в нужной версии (или Appium настроен на автоустановку)
- Тестовая учётная запись создана и не используется другим тестом параллельно
- Appium-сервер запущен, порт свободен
- В Desired Capabilities указан явный
udid - Логи устройства (
adb logcat) настроены на запись для разбора падений
Как выбрать набор устройств для покрытия аудитории
Один из самых частых вопросов при организации тестовой среды: какие именно модели включить в парк? Покупать всё подряд нет смысла, а тестировать только на флагмане опасно.
Отправная точка - аналитика реальной аудитории. Google Play Console и App Store Connect показывают распределение по моделям и версиям ОС среди ваших пользователей. Если 40% аудитории сидит на Android 12 и бюджетных Xiaomi, именно там нужно искать проблемы в первую очередь.
Если аналитики ещё нет (новый продукт), ориентируйтесь на рыночную статистику. По данным StatCounter, в России и СНГ среди Android-аудитории доминируют Samsung, Xiaomi и realme. Среди версий ОС - Android 12 и 13. Для iOS картина проще: большинство активных пользователей обновляются до последних двух версий системы.
Практический минимум для нового проекта:
- Флагман с актуальной версией ОС (Samsung Galaxy S-серия или iPhone последних двух поколений)
- Бюджетный Android с 3-4 ГБ RAM и версией ОС на 1-2 поколения старше актуальной
- Xiaomi или Redmi с MIUI - из-за агрессивного управления фоновыми процессами
- Планшет, если приложение адаптировано под большой экран
Этот набор покрывает большинство сценариев, где реальные пользователи сталкиваются с проблемами, невидимыми на виртуальных машинах.
Тестирование сетевых условий: что не воспроизводит виртуальная среда
Сеть - ещё одна область, где виртуальная среда даёт искажённую картину. Эмулятор работает через сеть хост-машины: стабильный Wi-Fi в офисе или дата-центре. Реальный пользователь переключается между 4G и Wi-Fi, теряет сигнал в лифте, использует мобильный интернет с высоким пингом.
Android Emulator позволяет задать профиль сети через AVD Manager: выбрать скорость и задержку, имитирующие 3G или Edge. Это лучше, чем ничего, но не воспроизводит нестабильность реального соединения - пакетные потери, внезапные обрывы, переключение между типами сети.
Для проверки поведения приложения в плохих сетевых условиях используют несколько подходов:
- Charles Proxy или mitmproxy - перехват трафика и искусственное замедление или блокировка запросов
- Android Network Emulator (встроен в AVD) - задаёт задержку и потери пакетов на уровне эмулятора
- Физическое тестирование в зонах со слабым сигналом - для критичных сценариев (оплата, авторизация, загрузка файлов)
Особенно важно проверять: что происходит с незавершённой транзакцией при обрыве сети, корректно ли приложение восстанавливает состояние после переподключения, не теряются ли данные при переключении с Wi-Fi на мобильный интернет в середине операции.
Хорошая практика: включите в релизный чеклист хотя бы один прогон ключевых сценариев (авторизация, оплата, загрузка контента) в условиях искусственно ухудшенной сети. Это занимает 20-30 минут, но регулярно выявляет баги, которые пользователи описывают как «приложение зависает» или «данные не сохраняются».
Матрица приоритетов: что проверять где
Когда ресурсы ограничены, полезно иметь чёткое правило: какие типы проверок идут на виртуальную среду, а какие требуют физического запуска. Таблица ниже помогает принять это решение быстро.
| Тип проверки | Виртуальная среда | Физическое железо | Облачный farm |
|---|---|---|---|
| Авторизация и регистрация | Достаточно | Не обязательно | Для покрытия моделей |
| Работа с камерой и медиа | Не подходит | Обязательно | Если есть реальные модели |
| Поведение при слабой сети | Частично (с proxy) | Предпочтительно | Ограниченно |
| Визуальная корректность UI | Базовая проверка | Для специфичных GPU | Широкое покрытие |
| Фоновые процессы и уведомления | Не подходит | Обязательно | Если поддерживается |
| Регрессия бизнес-логики | Оптимально | Не обязательно | Для критичных релизов |
| Поведение при входящем звонке | Не подходит | Обязательно | Редко поддерживается |
| Тест производительности и FPS | Ненадёжно | Обязательно | На реальных моделях |