1. Архитектура мобильных платформ iOS/Android и классификация типов приложений
Архитектура мобильных платформ iOS/Android и классификация типов приложений
Представьте, что вы тестируете веб-приложение: баг в коде фронтенда исправляется одной правкой на сервере, и через секунду все пользователи видят обновленную версию. В мобильном мире ошибка, попавшая в релиз, может «жить» на устройствах пользователей неделями, пока они не соизволят нажать кнопку «Обновить» в App Store или Google Play. Если же вы не учли архитектурные различия между Android и iOS, ваше приложение может идеально работать на флагманском Samsung, но намертво зависать на iPhone из-за специфики управления памятью. Переход из Web QA в Mobile QA — это не просто смена Chrome DevTools на эмулятор, это глубокое погружение в «железо», операционные системы и жизненный цикл программ, которые работают в условиях ограниченных ресурсов.
Фундаментальные различия Android и iOS: взгляд инженера
Для тестировщика разница между Android и iOS начинается на уровне философии управления ресурсами и доступа к системе. Android — это открытость и фрагментация, iOS — это закрытая экосистема и жесткий контроль.
Архитектура Android: Слоеный пирог Google
Android базируется на ядре Linux, но это не классический дистрибутив Linux. Архитектуру Android принято представлять в виде пяти уровней, и понимание каждого из них критично для локализации багов.
Архитектура iOS: Закрытая крепость Apple
Apple использует архитектуру, основанную на ядре XNU (Darwin), и разделяет её на четыре логических слоя. Главное отличие для QA — здесь нет виртуальной машины типа ART; код выполняется максимально близко к «железу», что дает преимущество в производительности, но накладывает жесткие ограничения на фоновые процессы.
Фрагментация против Унификации
Одна из главных болей Mobile QA — фрагментация Android. На рынке существуют тысячи моделей устройств с разными разрешениями экрана, процессорами и версиями ОС.
> Фрагментация — это ситуация, когда одна и та же версия операционной системы модифицируется производителями (Samsung, Xiaomi, Huawei) путем наложения собственных графических оболочек (One UI, MIUI), что может приводить к непредсказуемому поведению стандартных API.
В iOS ситуация обратная. Список устройств ограничен, а пользователи обновляются на свежую версию ОС очень быстро. Для тестировщика это означает: * В Android: Нужно формировать «парк устройств» на основе статистики рынка (например, обязательно иметь один чистый Android на Google Pixel и один сильно модифицированный на Xiaomi). * В iOS: Достаточно тестировать на последней и предпоследней версиях ОС, уделяя внимание разнице между экранами с «челкой» и без неё.
Классификация мобильных приложений: Нативные, Веб и Гибриды
Выбор стратегии тестирования напрямую зависит от того, как написано приложение. Вы не можете требовать от веб-приложения такой же скорости работы жестов, как от нативного, и это не будет багом — это архитектурное ограничение.
Нативные приложения (Native Apps)
Нативные приложения пишутся на языках, «родных» для платформы: Kotlin/Java для Android и Swift/Objective-C для iOS.
* Преимущества: Максимальная производительность, полный доступ к API устройства (контакты, сенсоры, биометрия), плавные анимации. * Особенности тестирования: Нужно проверять установку, удаление, обновление версии. Тестировщик должен уметь работать с логами (Logcat в Android, Console в iOS). * Сложность: Для каждой платформы пишется свой код. Если нашли баг на Android, не факт, что он есть на iOS.
Мобильные веб-приложения (Web Apps / PWA)
Это, по сути, сайты, оптимизированные под мобильные браузеры. Progressive Web Apps (PWA) позволяют «установить» сайт на главный экран, но под капотом это все тот же браузерный движок.
* Преимущества: Один код для всех платформ, не нужно проходить модерацию в сторах. * Особенности тестирования: Ключевой упор на кросс-браузерность (Safari на iOS vs Chrome на Android). Важно проверять адаптивность верстки под разные ориентации экрана. * Сложность: Нет доступа к большинству системных функций (например, Bluetooth или сложным фоновым процессам).
Гибридные приложения (Hybrid Apps)
Это «веб-сайт, завернутый в нативную оболочку». Используются фреймворки типа Cordova или Ionic. Внутри нативного контейнера открывается компонент WebView, который отображает HTML/CSS/JS.
* Особенности тестирования: Самая коварная часть — взаимодействие между веб-кодом и нативной «оберткой». Часто возникают баги с производительностью скролла и откликом на нажатия. * Нюанс: Тестировщику нужно проверять, как приложение ведет себя при отсутствии интернета, так как часто ресурсы подгружаются извне.
Кроссплатформенные приложения (Flutter, React Native)
Это современный тренд. Код пишется на одном языке (Dart для Flutter или JS для React Native), но при компиляции он либо превращается в нативные компоненты (React Native), либо отрисовывается собственным графическим движком (Flutter).
* Для QA: Это выглядит как нативное приложение, но со своими странностями. Например, во Flutter все элементы — это виджеты, отрисованные движком Skia, поэтому стандартные инструменты инспекции элементов (типа Appium Inspector) могут видеть экран как одну большую картинку, если разработчики не проставили специальные метки доступа (Accessibility Labels).
Работа с памятью и жизненный цикл (Lifecycle)
В вебе пользователь может просто закрыть вкладку. В мобилках приложение может быть свернуто, перекрыто звонком или убито системой из-за нехватки оперативной памяти.
Жизненный цикл Activity (Android)
Тестировщик обязан знать состояния приложения. Основные из них:
Кейс для тестирования: Вы заполняете длинную анкету в приложении, вам поступает входящий звонок на 10 минут. Вы возвращаетесь в приложение. Сохранились ли данные? Если разработчик не обработал сохранение состояния в onSaveInstanceState(), данные пропадут. Это классический мобильный баг, которого нет в вебе.
Жизненный цикл в iOS (App Delegate)
В iOS состояния чуть иные: Active, Inactive (например, вытянули шторку уведомлений), Background и Suspended. Важно помнить, что iOS очень агрессивно убивает фоновые процессы. Если ваше приложение должно качать файл в фоне, нужно проверять, использует ли оно специальные Background Tasks, иначе загрузка прервется через несколько секунд после сворачивания.
Песочница (Sandboxing) и файловая система
В отличие от десктопных ОС, где программа может (при наличии прав) залезть в папку другой программы, мобильные ОС используют принцип «песочницы».
> Sandboxing — это механизм безопасности, при котором каждому приложению выделяется своя изолированная область памяти и хранилища. Приложение "А" не может прочитать данные приложения "Б" напрямую.
Для тестировщика это означает: * Если приложению нужно сохранить фото в галерею, оно должно явно запросить разрешение (Permission) у системы. Тестирование разрешений — огромный пласт работы. Что будет, если пользователь нажмет «Запретить»? Упадет ли приложение при попытке открыть камеру? * В Android есть «внутреннее» (private) и «внешнее» (shared) хранилище. В iOS доступ к файловой системе вне песочницы приложения практически закрыт для пользователя и других программ.
Разница в интерфейсах и Human Interface Guidelines (HIG) vs Material Design
Тестировщик — это еще и адвокат пользователя. Вы должны знать, что поведение «назад» в Android и iOS реализовано по-разному. * Android: Есть системная кнопка «Назад» (или жест). Она должна возвращать пользователя на предыдущий экран или закрывать модальное окно. * iOS: Системной кнопки нет. Навигация должна быть предусмотрена внутри интерфейса (кнопка в навигейшн-баре или жест swipe-to-back от левого края экрана).
Если вы видите в iOS-приложении кнопку «Назад» в нижнем левом углу, как в старом Android — это дефект проектирования, нарушающий гайдлайны платформы. Пользователю будет неудобно.
Сетевое взаимодействие в мобильных условиях
В вебе мы привыкли к стабильному (чаще всего) Ethernet или Wi-Fi. Мобильное устройство постоянно меняет тип сети: 4G -> 3G -> Edge -> Wi-Fi -> Потеря связи в лифте.
Архитектурный нюанс: Мобильные ОС имеют свои таймауты на сетевые запросы. Тестировщику важно проверять:
Пуш-уведомления: FCM и APNs
Пуши — это не просто всплывающие окна. Это сложная цепочка взаимодействия. * Android: Использует Firebase Cloud Messaging (FCM). * iOS: Использует Apple Push Notification service (APNs).
Для тестировщика важно понимать: пуш может не прийти не потому, что сломан бэкенд, а потому, что на устройстве включен режим энергосбережения, который обрубил соединение с сервисом уведомлений. В Android уведомления более гибкие (можно настраивать каналы уведомлений), в iOS — более строгие в плане разрешений.
Подготовка к тестированию: краткий чек-лист архитектурных проверок
Перед тем как приступить к функциональному тестированию, Mobile QA инженер должен задать себе вопросы:
Понимание того, как устроены «внутренности» iOS и Android, превращает тестировщика из человека, который просто «тыкает в кнопки», в инженера, способного по логам определить, на каком уровне произошел сбой: в коде приложения, во фреймворке ОС или из-за ограничений «песочницы». Это фундамент, на котором строится вся дальнейшая работа с инструментами отладки, прокси-серверами и автоматизацией.