mobilegame-qalifecycleandroidiosqa

Тестирование прерываний и жизненного цикла мобильного приложения

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

Прерывания

Что-то происходит поверх твоего действия — приложение должно это пережить:

  • Входящий звонок прямо во время оплаты/ввода/игры — вернулись, состояние на месте?
  • Пуш-уведомление и тап по нему из середины сценария — куда ведёт, не ломает ли текущий экран.
  • Будильник, таймер, шторка уведомлений, Control Center.
  • Split-screen / многооконность, картинка-в-картинке.
  • Биометрия (Face ID / отпечаток) поверх экрана — подтверждение оплаты, автоблокировка.
  • В играх: сворачивание в середине матча/анимации/загрузки — не рассыпалось ли.

Жизненный цикл и убийство процесса

Самая частая дыра. Свернул приложение → ОС в фоне убила процесс ради памяти → пользователь вернулся:

  • Приложение восстанавливает состояние (тот же экран, введённые данные, позиция), а не стартует с нуля?
  • Несохранённые данные (черновик формы, корзина, прогресс) не потеряны?
  • Токен/сессия ещё живы или корректно продлеваются?
  • Android: воспроизводится через Developer Options → «Don’t keep activities» (ОС убивает activity сразу при сворачивании). Классический ловец багов восстановления.
  • iOS: приложение из suspended может быть terminated — проверь холодный и «тёплый» возврат.

Поворот экрана

  • Поворот пересоздаёт экран (Android — Activity): введённый текст, состояние списка, открытый диалог — сохраняются?
  • Верстка не ломается в landscape; ничего не обрезано.
  • Поворот во время запроса/анимации/диалога.

Сеть

Мобильная сеть нестабильна by design — это надо провоцировать:

  • Обрыв посреди запроса (отправил форму — сеть пропала): не завис, показал ошибку, дал ретрай.
  • Переключение wifi ↔ LTE, самолётный режим и обратно.
  • Медленная сеть (2G/большая задержка) — таймауты, спиннеры, не зависает.
  • Дубли при ретраях — обрыв + повтор не создают две записи/два платежа (идемпотентность).
  • Офлайн-режим — что доступно без сети, корректная синхронизация при возврате.

Ресурсы устройства

  • Low-memory kill — под давлением памяти ОС убивает фон (см. жизненный цикл).
  • Режим энергосбережения / Low Power — фоновые задачи, пуши, синхронизация урезаются.
  • Троттлинг и нагрев (особенно игры) — падение FPS, поведение при перегреве.
  • Нет места на диске — скачивание/кэш/сохранение: понятная ошибка, а не краш.
  • Разряд/зарядка, входящий во время тяжёлой операции.

Разрешения

  • Пользователь отозвал разрешение (камера, гео, микрофон, уведомления) в настройках, пока приложение в фоне → вернулся: приложение не падает, а корректно просит заново/деградирует.
  • Первый отказ и «больше не спрашивать».
  • Изменение системных настроек (тема, язык, размер шрифта) на лету.

Как это воспроизводить

  • Android adb: убийство процесса adb shell am kill <pkg>, Developer Options «Don’t keep activities», «Background process limit».
  • Сеть: авиарежим/тумблеры, Network Link Conditioner (iOS/macOS), эмуляция 2G/потерь в эмуляторе/Charstuff-прокси.
  • Прерывания: реальный звонок/пуш; на эмуляторе — extended controls (звонок, поворот, батарея).
  • Реальные девайсы важнее эмулятора для памяти/сети/нагрева — но эмулятор удобен для быстрых edge-кейсов.
  • Держи короткий чек-лист прерываний, прогоняй по ключевым экранам (оплата, форма, игра, онбординг).

Коротко

  • Баги живут на стыке с ОС: звонок/пуш/сворачивание/поворот/сеть/память.
  • Главная дыра — убийство процесса в фоне: возврат должен восстановить состояние, а не начать с нуля (Android «Don’t keep activities»).
  • Поворот пересоздаёт экран — проверь сохранение введённого.
  • Сеть провоцируй: обрыв в запросе, wifi↔LTE, медленно, дубли при ретраях, офлайн.
  • Ресурсы: low-memory kill, энергосбережение, нет места, нагрев.
  • Разрешения могут отозвать в фоне — не падай.
  • Воспроизводи через adb/Network Link Conditioner + реальные девайсы; веди чек-лист прерываний.