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

Специфика мобильного тестирования

Мобильное - не веб на маленьком экране

Посчитаем один экран оплаты. Приложение бывает в трёх состояниях: открыто, свёрнуто, выгружено системой. Внешних событий, которые могут прилететь поверх, минимум пять: звонок, уведомление, потеря сети, разряд батареи, поворот экрана. Три на пять - пятнадцать сочетаний, и в каждом живут деньги. Обычно проверяют одно: нажал «оплатить» в открытом приложении.

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

// Формулировки: «чем мобильное тестирование отличается от веба?», «что такое фрагментация?», «какие мобильные сценарии чаще всего забывают?».

Свои источники багов

Первое отличие от веба - приложение не живёт непрерывно. Система выгружает его из памяти, когда та нужна другим, и при возврате оно поднимается заново. Значит, всё, что человек ввёл и не отправил, должно быть где-то сохранено, иначе он вернётся к пустой форме.

Второе - разрешения. Камера, местоположение, контакты, уведомления запрашиваются у системы отдельно, и человек может отказать, а потом отозвать разрешение прямо посреди работы, зайдя в настройки. Приложение обязано это пережить и объяснить, а не упасть.

// Третье - сам продукт бывает разного устройства, и от этого зависят баги. Нативное написано под платформу и имеет полный доступ к ней. Кроссплатформенное собирается из одного кода под обе системы - и приносит свои артефакты на стыке с платформой. Отдельный случай - встроенный браузер внутри приложения (WebView): экран выглядит как часть приложения, а на деле это веб-страница со своими правилами хранения данных и возврата назад.

выгрузка системой
приложение убито ради памяти; при возврате поднимается с нуля
встроенный браузер
веб-страница внутри приложения; ведёт себя как веб, а не как экран

Фрагментация: замер матрицы

Фрагментация - это разнообразие устройств, на которых крутится ваше приложение. Посчитаем скромный набор осей: 6 версий системы, 5 размеров экрана, 4 производителя, 3 плотности экрана. Перемножаем: 360 сочетаний. По полчаса на короткий прогон - 180 часов на один круг. Ни один человек этого не сделает.

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

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

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

Прерывания, сеть, обновление

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

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

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

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

Как отвечать: «Чем мобильное тестирование отличается от веба?»

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

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

На чём валят

  • Проверять оплату только в открытом приложении: из пятнадцати сочетаний с прерываниями закрыто одно.
  • Тестировать на флагмане из офиса, когда аудитория сидит на бюджетниках трёхлетней давности.
  • Забыть переключение сетей: форма теряет введённое при переходе с беспроводной на мобильную.
  • Проверять только «разрешил»: отказ и отзыв разрешения посреди сценария роняют приложение.
  • Тестировать чистую установку и не тестировать обновление поверх старой версии с данными.

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

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

  1. #mobile_specifics1 / 5
    Чем проверка на реальном устройстве важнее, чем на эмуляторе/симуляторе?
    A)Эмулятор не позволяет установить и запустить мобильное приложение
    B)Реальное устройство не требует установки приложения для проверки
    C)На реальном ловятся жесты, сеть, батарея, датчики и настоящая производительность
    D)Эмулятор показывает лишь вёрстку экранов, но саму бизнес-логику приложения не запускает
    показать ответ и разбор
    +C)На реальном ловятся жесты, сеть, батарея, датчики и настоящая производительность

    // разбор: Эмулятор (Android) и симулятор (iOS) удобны для быстрой проверки вёрстки и логики, но не воспроизводят реальность: настоящие жесты и мультитач, поведение на мобильной сети и при её потере, расход и нагрев батареи, GPS и датчики, скорость слабого железа, специфику прошивки вендора. Критичные сценарии и релиз проверяют на реальных устройствах (свои или ферма), а эмулятор — для ранних быстрых прогонов.

  2. #mobile_specifics2 / 5
    Как выбрать устройства для тестирования, если покрыть все невозможно?
    A)Взять только самые новые флагманские модели: на них свежая ОС и большой запас мощности
    B)Проверять лишь на тех устройствах, что есть у команды под рукой
    C)Тестировать на одной эталонной модели и распространить вывод на остальные
    D)По аналитике аудитории: топ устройств/ОС/экранов плюс граничные (старые, слабые)
    показать ответ и разбор
    +D)По аналитике аудитории: топ устройств/ОС/экранов плюс граничные (старые, слабые)

    // разбор: Матрицу устройств строят по данным: какие модели, версии ОС и разрешения реально у аудитории (аналитика/сторы), плюс осознанно берут граничные случаи — самую старую поддерживаемую ОС, самый маленький и большой экран, слабое железо, где чаще ломается. Флагманы прячут проблемы производительности; «что под рукой» не репрезентативно. Матрицу пересматривают со сменой аудитории, остальное добирают фермой.

  3. #mobile_specifics3 / 5
    Что дают облачные фермы устройств (BrowserStack, Firebase Test Lab)?
    A)Доступ к сотням реальных устройств и ОС удалённо, без закупки парка железа
    B)Автоматическую генерацию тест-кейсов под каждое устройство
    C)Гарантию, что приложение пройдёт ревью в App Store и Google Play
    D)Замену реальным устройствам эмуляторами, которые ведут себя точь-в-точь как железо
    показать ответ и разбор
    +A)Доступ к сотням реальных устройств и ОС удалённо, без закупки парка железа

    // разбор: Фермы дают удалённый доступ к большому парку реальных (и эмулированных) устройств с разными ОС — ручной прогон или автотесты на моделях, которых нет в команде. Снимают проблему закупки и хранения десятков телефонов, дают редкие/старые модели и параллельный прогон. Не заменяют мышление тестировщика и не гарантируют прохождение ревью стора. Минусы: задержки удалённого доступа, ограничения на датчики, стоимость. Часто комбинируют: свои устройства плюс ферма для широты.

  4. #mobile_specifics4 / 5
    Что важно проверить в сценариях с разрешениями (permissions) приложения?
    A)Что приложение запрашивает все возможные разрешения сразу при установке
    B)Поведение при отказе в разрешении и при его отзыве позже в настройках
    C)Что без разрешения приложение полностью перестаёт запускаться
    D)Что разрешения выдаются приложению системой автоматически без участия юзера
    показать ответ и разбор
    +B)Поведение при отказе в разрешении и при его отзыве позже в настройках

    // разбор: Современные iOS/Android спрашивают разрешения (геолокация, камера, уведомления, файлы) в рантайме, и пользователь может отказать или отозвать их позже в настройках. Тестировщик проверяет все ветки: выдал — работает; отказал — приложение не падает, а корректно деградирует и объясняет, зачем нужно; отозвал во время работы — обрабатывается; повторный запрос ведёт себя правильно. Частый баг — краш или тупик при отказе в разрешении.

  5. #mobile_specifics5 / 5
    Почему одно приложение тестируют на iOS и Android отдельно, а не переносят результаты?
    A)IOS-приложения не нуждаются в тестировании — Apple проверяет их сама
    B)Android и iOS используют один код, поэтому расхождений между ними встречается редко
    C)Разные гайдлайны, навигация, разрешения, поведение системы и фрагментация дают разные дефекты
    D)IOS вообще не поддерживает автоматизацию тестирования приложений
    показать ответ и разбор
    +C)Разные гайдлайны, навигация, разрешения, поведение системы и фрагментация дают разные дефекты

    // разбор: Платформы различаются на многих уровнях: гайдлайны и паттерны навигации (кнопка «назад» на Android vs жест на iOS), модель разрешений, работа уведомлений и фона, жизненный цикл, клавиатуры, вёрстка, фрагментация (Android шире). Даже общий кроссплатформенный код по-разному ложится на нативные API. Поэтому баг на одной платформе не означает такой же на другой. Матрицу и прогоны ведут по платформам отдельно.

дальше

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

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