Тестирование прерываний и жизненного цикла мобильного приложения
Мобильное приложение никогда не работает в вакууме. Пока пользователь в нём, операционная система в любой момент вмешивается: звонок, пуш, сворачивание, нехватка памяти, поворот экрана. И именно на этих стыках прячутся самые обидные баги, которые в спокойном ручном прогоне не видно. Разберём, что и как тут тестировать.
Прерывания
Что-то происходит поверх твоего действия — приложение должно это пережить:
- Входящий звонок прямо во время оплаты/ввода/игры — вернулись, состояние на месте?
- Пуш-уведомление и тап по нему из середины сценария — куда ведёт, не ломает ли текущий экран.
- Будильник, таймер, шторка уведомлений, 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 + реальные девайсы; веди чек-лист прерываний.