сеньорчикОткрыть в Telegram
← вся теориятеория к собесу · Мобильное тестирование

Инструменты мобильной автоматизации

Инструменты и автоматизация

Скромная матрица устройств - 6 версий системы, 5 размеров экрана, 4 производителя, 3 плотности - это 360 сочетаний. По полчаса на короткий прогон выходит 180 часов на один круг. Именно из этой цифры растёт всё, что дальше: и автоматизация, и фермы устройств, и вопрос, что гонять на эмуляторе, а что на настоящем телефоне.

Стержень: эмуляторы берут массу прогонов, а настоящие устройства нужны там, где эмулятор физически не воспроизводит поведение.

// Формулировки: «кроссплатформенный инструмент или родные?», «зачем настоящие устройства?», «что даёт перехват трафика?».

Кроссплатформенный инструмент против родных

Выбор здесь один и он про компромисс. Appium - кроссплатформенный: один набор тестов работает и на Apple, и на Android, писать можно на привычном языке, потому что он говорит с устройством по общему протоколу управления браузерами и приложениями. Плата за универсальность - он медленнее и хрупче, потому что между тестом и приложением стоит лишняя прослойка.

Родные инструменты - Espresso у Android и XCUITest у Apple - живут внутри платформы, поэтому быстрее и стабильнее: они знают, когда приложение закончило работу и готово к следующему действию. Плата - это два разных набора тестов на двух языках, лежащих в проекте приложения, а значит нужна помощь разработчиков.

// Практический критерий: если команда одна и небольшая, обычно берут кроссплатформенный набор ради единой кодовой базы. Если платформы развивают отдельные команды и важны скорость и стабильность прогонов - родные. А вот способ находить элементы одинаков в обоих случаях: по идентификатору доступности, который ставят разработчики, а не по координатам или порядковому номеру - те рассыпаются на другом разрешении, а разрешений в матрице десятки.

кроссплатформенный набор
один код на обе системы ценой скорости и устойчивости
идентификатор доступности
устойчивая метка элемента; координаты и номера рассыпаются на другом экране

Эмулятор и настоящий телефон

Эмулятор - виртуальное устройство на машине сборки. Он дёшев, запускается по требованию, легко размножается, и на нём удобно гонять основную массу проверок - логику, переходы, формы.

Но есть вещи, которые он не воспроизводит по определению: настоящие жесты и мультитач, камера, датчики, реальные уведомления, расход батареи, скорость железа, а главное - прошивки производителей с их правилами выгрузки фоновых приложений. Всё это проверяют на настоящих телефонах.

// Отсюда типичная дыра: вся автоматизация живёт на эмуляторах, потому что так проще для сборки, и именно те баги, ради которых мобильное тестирование вообще существует, остаются непокрытыми. Если своего шкафа с телефонами нет, матрицу арендуют - облачные фермы дают доступ к настоящим устройствам, включая старые модели, которых уже не купить.

эмулятор
виртуальное устройство: дёшево и быстро, но не всё воспроизводит
ферма устройств
облако настоящих телефонов для матрицы без своего шкафа

Консоль устройства, трафик, сборки

Главный инструмент на Android - ADB (Android Debug Bridge), консоль связи с устройством. Через неё берут системные логи, ставят и удаляют приложение, чистят его данные, эмулируют звонок и координаты, снимают экран, открывают ссылки внутрь приложения. Разница в баг-репортах огромная: «крашнулось» против «вот лог падения с этого места» - это неделя переписки против часа работы.

Перехват трафика приложения (Charles, mitmproxy) даёт две вещи. Первая - подменять ответы сервера и получать сложные состояния без участия разработчиков: пустой список, ошибка оплаты, просроченный токен доступа. Вторая - видеть, что приложение реально отправляет, включая аналитику: это единственный способ поймать отправку личных данных открытым текстом.

// Сборки для проверки раздают через магазины для тестировщиков, и внутри сборки держат переключатель окружения, чтобы одна и та же версия ходила на тестовый сервер и на боевой. А на сервере сборки, который сам собирает приложение и гоняет тесты на каждое изменение, мобильные тесты выстраивают ступенями: короткий смоук (несколько шагов, подтверждающих, что главное работает) на изменение, полная матрица - ночью, с сохранением видео, логов и снимков экрана при падении.

ADB
Android Debug Bridge: консоль связи с устройством - логи, данные, ссылки, эмуляция
перехват трафика
подмена ответов сервера и контроль того, что приложение реально отправляет

Как отвечать: «Кроссплатформенный инструмент или родные - как выбрать?»

Это компромисс, и выбираю по составу команды и по тому, что важнее. Кроссплатформенный Appium даёт один набор тестов на обе системы и привычный язык, что удобно небольшой команде, которой не потянуть два стека. Платишь за это скоростью и устойчивостью: между тестом и приложением стоит лишняя прослойка. Родные инструменты, Espresso и XCUITest, живут внутри платформы, поэтому быстрее и стабильнее - они точно знают, когда приложение готово к следующему действию, - но это два отдельных набора в проекте приложения, и без вовлечённости разработчиков не обойтись. Поэтому если команда одна, беру кроссплатформенный ради единой базы; если платформы развивают разные команды и важна скорость прогона - родные. Что не зависит от выбора: элементы ищу по идентификатору доступности, а не по координатам, потому что координаты рассыпаются на другом разрешении, а разрешений в матрице десятки. И помню, что часть проверок вообще нельзя автоматизировать на эмуляторе - жесты, камера, уведомления, батарея, прошивки производителей требуют настоящих устройств.

Почему это сильный ответ: обе стороны компромисса названы с причинами, дан внятный критерий выбора, и добавлены две вещи, не зависящие от инструмента, - устойчивые локаторы и потребность в настоящих устройствах.

На чём валят

  • Держать всю автоматизацию на эмуляторах: уведомления, камера и прошивки производителей не покрыты.
  • Искать элементы по координатам и порядковым номерам - другое разрешение всё ломает.
  • Баг-репорт «крашнулось» без лога с устройства - неделя переписки вместо часа.
  • Ни разу не посмотреть трафик приложения - отправку личных данных в аналитику иначе не поймать.
  • Гонять полную матрицу устройств на каждое изменение - очередь на сборке в полдня.

Проверьте себя

Пять вопросов из банка по этой подтеме. Всего их 12, остальные разбираются в тренажёре.

  1. #mobile_tools_automation1 / 5
    Зачем тестировщику логи устройства (LogCat на Android, Console на iOS)?
    A)Чтобы приложение само автоматически чинило найденные при тестировании баги
    B)Чтобы увидеть ошибку/стек-трейс в момент дефекта и приложить к баг-репорту
    C)Чтобы точно измерить итоговый размер установленного приложения
    D)Чтобы напрямую опубликовать приложение в магазине приложений
    показать ответ и разбор
    +B)Чтобы увидеть ошибку/стек-трейс в момент дефекта и приложить к баг-репорту

    // разбор: Логи устройства показывают, что происходило внутри в момент сбоя: исключения, стек-трейсы крашей, сетевые ошибки, предупреждения. LogCat (Android, через ADB/Android Studio) и Console/логи симулятора (iOS) позволяют фильтровать по приложению и уровню, поймать причину плавающего бага и приложить фрагмент к репорту — это резко ускоряет фикс. Тестировщик снимает логи параллельно с воспроизведением, особенно для крашей и «иногда не работает».

  2. #mobile_tools_automation2 / 5
    Что такое Appium в автоматизации мобильного тестирования?
    A)Облачная ферма из реальных устройств, предназначенная для ручных прогонов
    B)Инструмент для генерации тестовых данных прямо на устройстве
    C)Кроссплатформенный драйвер (WebDriver) для автотестов iOS и Android
    D)Система сборки мобильных приложений из исходного кода под обе платформы
    показать ответ и разбор
    +C)Кроссплатформенный драйвер (WebDriver) для автотестов iOS и Android

    // разбор: Appium — популярный опенсорс-фреймворк автоматизации мобильных приложений: по протоколу WebDriver (как Selenium для веба) он драйвит нативные, гибридные и мобильные веб-приложения на iOS и Android, в идеале одним API и на разных языках. Под капотом использует нативные движки (XCUITest, UiAutomator2). Плюс — кроссплатформенность и знакомый WebDriver; минус — медленнее и капризнее нативных фреймворков. Элементы ищет по локаторам, лучший — Accessibility ID.

  3. #mobile_tools_automation3 / 5
    Почему в мобильной автоматизации предпочитают локатор Accessibility ID?
    A)Он самый короткий по числу символов, поэтому автотест с ним пишется и читается быстрее
    B)Он работает только на iOS и именно поэтому считается надёжнее
    C)Он жёстко привязан к координатам элемента на экране устройства
    D)Он стабилен и кроссплатформенный, меньше ломается при изменениях вёрстки
    показать ответ и разбор
    +D)Он стабилен и кроссплатформенный, меньше ломается при изменениях вёрстки

    // разбор: Accessibility ID (accessibility label/identifier) — семантический идентификатор элемента, общий для iOS и Android, который команда задаёт осознанно. Он устойчивее XPath (тот привязан к структуре дерева и ломается при малейшей правке вёрстки) и координат (те плывут между устройствами и разрешениями). Один и тот же ID работает на обеих платформах, что удобно для кроссплатформенных тестов, и он же улучшает доступность. Поэтому автоматизаторы просят разработчиков проставлять осмысленные accessibility ID.

  4. #mobile_tools_automation4 / 5
    Чем нативные фреймворки (Espresso/XCUITest) отличаются от Appium?
    A)Нативные быстрее и стабильнее на своей платформе, но не кроссплатформенны
    B)Нативные работают сразу на iOS и Android, а вот Appium — нет
    C)Нативные фреймворки не умеют находить элементы по локаторам
    D)Нативные фреймворки нужны для ручного тестирования, а автотесты пишут только на Appium
    показать ответ и разбор
    +A)Нативные быстрее и стабильнее на своей платформе, но не кроссплатформенны

    // разбор: Espresso (Android) и XCUITest (iOS) — нативные фреймворки автотестов: работают внутри платформы, поэтому быстрее, стабильнее и имеют доступ к синхронизации с UI (Espresso сам ждёт простоя потока). Минус — каждый только под свою платформу и обычно на её языке, поэтому нужна отдельная кодовая база. Appium даёт один кроссплатформенный API поверх нативных движков, но медленнее и более хрупок. Выбор — трейдоф: скорость и стабильность против кроссплатформенности.

  5. #mobile_tools_automation5 / 5
    Как тестировщик перехватывает и смотрит сетевой трафик мобильного приложения?
    A)Через LogCat: он пишет весь сетевой HTTP-трафик устройства вместе с телом запросов
    B)Прокси (Charles/Fiddler) на устройстве: видно запросы/ответы, можно подменять
    C)Трафик мобильного приложения перехватить не получается
    D)Запросы приложения может увидеть только разработчик, но не тестировщик
    показать ответ и разбор
    +B)Прокси (Charles/Fiddler) на устройстве: видно запросы/ответы, можно подменять

    // разбор: Телефон направляют через прокси (Charles, Fiddler, mitmproxy, Proxyman): устройство и компьютер в одной сети, в настройках Wi-Fi прописан прокси, установлен его корневой сертификат для расшифровки HTTPS. Тогда видно реальные запросы/ответы приложения, тайминги, коды, можно ставить брейкпоинты, подменять ответы, эмулировать ошибки сервера и медленную сеть. Нюанс: certificate pinning в приложении блокирует расшифровку — нужен спец-билд или обход. LogCat трафик так не показывает.

дальше

Теорию прочитали. Навык ставится повторением

В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, лимит только на количество вопросов в день.