Специфика мобильного тестирования
Посчитаем один экран оплаты. Приложение бывает в трёх состояниях: открыто, свёрнуто, выгружено системой. Внешних событий, которые могут прилететь поверх, минимум пять: звонок, уведомление, потеря сети, разряд батареи, поворот экрана. Три на пять - пятнадцать сочетаний, и в каждом живут деньги. Обычно проверяют одно: нажал «оплатить» в открытом приложении.
Стержень: у мобильного есть классы дефектов, которых на вебе нет вовсе - выгрузка системой, прерывания, отзыв разрешений, обновление с данными.
// Формулировки: «чем мобильное тестирование отличается от веба?», «что такое фрагментация?», «какие мобильные сценарии чаще всего забывают?».
Свои источники багов
Первое отличие от веба - приложение не живёт непрерывно. Система выгружает его из памяти, когда та нужна другим, и при возврате оно поднимается заново. Значит, всё, что человек ввёл и не отправил, должно быть где-то сохранено, иначе он вернётся к пустой форме.
Второе - разрешения. Камера, местоположение, контакты, уведомления запрашиваются у системы отдельно, и человек может отказать, а потом отозвать разрешение прямо посреди работы, зайдя в настройки. Приложение обязано это пережить и объяснить, а не упасть.
// Третье - сам продукт бывает разного устройства, и от этого зависят баги. Нативное написано под платформу и имеет полный доступ к ней. Кроссплатформенное собирается из одного кода под обе системы - и приносит свои артефакты на стыке с платформой. Отдельный случай - встроенный браузер внутри приложения (WebView): экран выглядит как часть приложения, а на деле это веб-страница со своими правилами хранения данных и возврата назад.
- выгрузка системой
- приложение убито ради памяти; при возврате поднимается с нуля
- встроенный браузер
- веб-страница внутри приложения; ведёт себя как веб, а не как экран
Фрагментация: замер матрицы
Фрагментация - это разнообразие устройств, на которых крутится ваше приложение. Посчитаем скромный набор осей: 6 версий системы, 5 размеров экрана, 4 производителя, 3 плотности экрана. Перемножаем: 360 сочетаний. По полчаса на короткий прогон - 180 часов на один круг. Ни один человек этого не сделает.
Поэтому матрицу режут по своей аналитике: берут устройства, на которых реально сидит ваша аудитория, и покрывают ими основную долю. Ключевое слово - своей: доли из общих обзоров рынка не совпадают с вашими, особенно если продукт нишевый.
// Две системы ведут себя по-разному, и это не вкусовщина. У Apple железо однообразное и поведение предсказуемое. На Android сверх версий системы наслаиваются прошивки производителей - это версии системы, доработанные под свои телефоны, - и часть из них агрессивно выгружает фоновые приложения, чтобы экономить батарею - то есть ваш сценарий с фоновой загрузкой на одном телефоне работает, а на другом обрывается. Отсюда практика: один и тот же сценарий на двух системах часто становится двумя разными тестами.
- фрагментация
- разнообразие версий, экранов и прошивок; полная матрица нереальна
- матрица устройств
- срез, покрывающий основную долю вашей аудитории
Прерывания, сеть, обновление
Вернусь к пятнадцати сочетаниям из начала. Прерывание - это внешнее событие, которое перекрывает ваш экран: входящий звонок, уведомление, будильник, окно поделиться. Вопрос всегда один: что стало с формой, платежом или загрузкой в этот момент, и что человек увидит, вернувшись. Оплата плюс входящий звонок - это реальные потерянные деньги, а не теоретический сценарий.
Сеть на телефоне нестабильна по природе: переключение между беспроводной сетью и мобильной, лифт, метро, медленный мобильный интернет, роуминг, режим экономии трафика. Проверял в браузере с выключенной сетью: запрос падает с ошибкой «не удалось получить», и система сообщает состояние отдельным признаком - приложение может его читать и вести себя осмысленно, а не молча крутить бесконечный индикатор.
// И самый недооценённый сценарий - обновление. Тестируют обычно чистую установку, а у живого человека приложение обновляется поверх старой версии с его данными: с накопленным кэшем (сохранённой копией данных, чтобы не грузить их заново), старым форматом хранения, недоотправленной очередью. Именно тут случаются падения сразу после релиза, причём у всех разом.
- прерывание
- внешнее событие поверх экрана: звонок, уведомление, будильник
- обновление поверх
- установка новой версии на старые данные - частая причина падений после релиза
Как отвечать: «Чем мобильное тестирование отличается от веба?»
Тем, что у мобильного есть целые классы дефектов, которых на вебе просто нет, и я делаю акцент именно на них. Первое - приложение не живёт непрерывно: система выгружает его из памяти, и при возврате оно поднимается заново, поэтому проверяю, что несохранённое не потерялось и человек вернулся туда, где был. Второе - прерывания: звонок или уведомление поверх экрана оплаты. Я как-то считал: три состояния приложения на пять внешних событий - это пятнадцать сочетаний на одном экране оплаты, а проверяют обычно одно. Третье - сеть по-настоящему рвётся: переход с беспроводной на мобильную, метро, лифт, и форма не должна терять ввод. Четвёртое - разрешения: их дают, отклоняют, а потом отзывают посреди работы. Пятое - фрагментация: я считал скромную матрицу из версий, экранов, производителей и плотностей - вышло триста шестьдесят сочетаний, то есть сто восемьдесят часов на один круг, поэтому её режут по своей аналитике. И отдельно - обновление поверх старой версии с данными, главный источник падений сразу после релиза.
Почему это сильный ответ: названы именно мобильные классы дефектов, а не «экран меньше», и два из них подкреплены счётом - пятнадцать сочетаний на экране оплаты и триста шестьдесят в матрице устройств.
На чём валят
- −Проверять оплату только в открытом приложении: из пятнадцати сочетаний с прерываниями закрыто одно.
- −Тестировать на флагмане из офиса, когда аудитория сидит на бюджетниках трёхлетней давности.
- −Забыть переключение сетей: форма теряет введённое при переходе с беспроводной на мобильную.
- −Проверять только «разрешил»: отказ и отзыв разрешения посреди сценария роняют приложение.
- −Тестировать чистую установку и не тестировать обновление поверх старой версии с данными.
Проверьте себя
Пять вопросов из банка по этой подтеме. Всего их 13, остальные разбираются в тренажёре.
- Чем проверка на реальном устройстве важнее, чем на эмуляторе/симуляторе?A)Эмулятор не позволяет установить и запустить мобильное приложениеB)Реальное устройство не требует установки приложения для проверкиC)На реальном ловятся жесты, сеть, батарея, датчики и настоящая производительностьD)Эмулятор показывает лишь вёрстку экранов, но саму бизнес-логику приложения не запускает
показать ответ и разбор
+C)На реальном ловятся жесты, сеть, батарея, датчики и настоящая производительность// разбор: Эмулятор (Android) и симулятор (iOS) удобны для быстрой проверки вёрстки и логики, но не воспроизводят реальность: настоящие жесты и мультитач, поведение на мобильной сети и при её потере, расход и нагрев батареи, GPS и датчики, скорость слабого железа, специфику прошивки вендора. Критичные сценарии и релиз проверяют на реальных устройствах (свои или ферма), а эмулятор — для ранних быстрых прогонов.
- Как выбрать устройства для тестирования, если покрыть все невозможно?A)Взять только самые новые флагманские модели: на них свежая ОС и большой запас мощностиB)Проверять лишь на тех устройствах, что есть у команды под рукойC)Тестировать на одной эталонной модели и распространить вывод на остальныеD)По аналитике аудитории: топ устройств/ОС/экранов плюс граничные (старые, слабые)
показать ответ и разбор
+D)По аналитике аудитории: топ устройств/ОС/экранов плюс граничные (старые, слабые)// разбор: Матрицу устройств строят по данным: какие модели, версии ОС и разрешения реально у аудитории (аналитика/сторы), плюс осознанно берут граничные случаи — самую старую поддерживаемую ОС, самый маленький и большой экран, слабое железо, где чаще ломается. Флагманы прячут проблемы производительности; «что под рукой» не репрезентативно. Матрицу пересматривают со сменой аудитории, остальное добирают фермой.
- Что дают облачные фермы устройств (BrowserStack, Firebase Test Lab)?A)Доступ к сотням реальных устройств и ОС удалённо, без закупки парка железаB)Автоматическую генерацию тест-кейсов под каждое устройствоC)Гарантию, что приложение пройдёт ревью в App Store и Google PlayD)Замену реальным устройствам эмуляторами, которые ведут себя точь-в-точь как железо
показать ответ и разбор
+A)Доступ к сотням реальных устройств и ОС удалённо, без закупки парка железа// разбор: Фермы дают удалённый доступ к большому парку реальных (и эмулированных) устройств с разными ОС — ручной прогон или автотесты на моделях, которых нет в команде. Снимают проблему закупки и хранения десятков телефонов, дают редкие/старые модели и параллельный прогон. Не заменяют мышление тестировщика и не гарантируют прохождение ревью стора. Минусы: задержки удалённого доступа, ограничения на датчики, стоимость. Часто комбинируют: свои устройства плюс ферма для широты.
- Что важно проверить в сценариях с разрешениями (permissions) приложения?A)Что приложение запрашивает все возможные разрешения сразу при установкеB)Поведение при отказе в разрешении и при его отзыве позже в настройкахC)Что без разрешения приложение полностью перестаёт запускатьсяD)Что разрешения выдаются приложению системой автоматически без участия юзера
показать ответ и разбор
+B)Поведение при отказе в разрешении и при его отзыве позже в настройках// разбор: Современные iOS/Android спрашивают разрешения (геолокация, камера, уведомления, файлы) в рантайме, и пользователь может отказать или отозвать их позже в настройках. Тестировщик проверяет все ветки: выдал — работает; отказал — приложение не падает, а корректно деградирует и объясняет, зачем нужно; отозвал во время работы — обрабатывается; повторный запрос ведёт себя правильно. Частый баг — краш или тупик при отказе в разрешении.
- Почему одно приложение тестируют на iOS и Android отдельно, а не переносят результаты?A)IOS-приложения не нуждаются в тестировании — Apple проверяет их самаB)Android и iOS используют один код, поэтому расхождений между ними встречается редкоC)Разные гайдлайны, навигация, разрешения, поведение системы и фрагментация дают разные дефектыD)IOS вообще не поддерживает автоматизацию тестирования приложений
показать ответ и разбор
+C)Разные гайдлайны, навигация, разрешения, поведение системы и фрагментация дают разные дефекты// разбор: Платформы различаются на многих уровнях: гайдлайны и паттерны навигации (кнопка «назад» на Android vs жест на iOS), модель разрешений, работа уведомлений и фона, жизненный цикл, клавиатуры, вёрстка, фрагментация (Android шире). Даже общий кроссплатформенный код по-разному ложится на нативные API. Поэтому баг на одной платформе не означает такой же на другой. Матрицу и прогоны ведут по платформам отдельно.
дальше
Теорию прочитали. Навык ставится повторением
В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, лимит только на количество вопросов в день.