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

Жизненный цикл мобильного приложения

Жизненный цикл приложения

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

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

// Формулировки: «какие состояния у приложения?», «что такое холодный старт?», «что теряется при повороте экрана?».

Три состояния и выгрузка

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

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

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

свёрнуто / выгружено
процесс жив, данные в памяти / процесс убит, память очищена
восстановление состояния
возврат на тот же экран с теми же данными после выгрузки

Старты и поворот экрана

Старты различают по тому, что уже готово. Холодный - процесса нет вовсе, всё поднимается с нуля: самый долгий и самый хрупкий. Тёплый - процесс жив, но экраны пересоздаются. Горячий - приложение просто возвращается из фона, почти мгновенно. Меряют и проверяют их отдельно, потому что человек оценивает приложение именно по холодному старту: он первый.

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

// Поэтому поворот прогоняют на каждой форме с заполненными полями, а не «на всякий случай один раз». И проверяют не сам поворот в одиночку: смена системной темы на тёмную и смена языка системы делают ровно то же самое.

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

Ссылки и уведомления по состояниям

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

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

// Уведомления проверяют по тем же трём состояниям, и поведение у них разное. В свёрнутом - системная плашка. В открытом - системную плашку показывать обычно не принято, и приложение рисует своё сообщение внутри; если этого не сделали, уведомление молча пропадёт. В выгруженном - нажатие должно поднять приложение и открыть тот экран, о котором уведомление, вместе с его содержимым.

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

Как отвечать: «Как тестировать жизненный цикл приложения?»

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

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

На чём валят

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

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

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

  1. #app_lifecycle1 / 5
    Почему поворот экрана — важный тест-сценарий на мобиле?
    A)Поворот экрана полностью закрывает приложение, и это надо проверить
    B)Поворот экрана отключает интернет вплоть до перезапуска приложения
    C)При повороте экран пересоздаётся — теряется ввод или ломается вёрстка
    D)Поворот экрана меняет версию операционной системы на устройстве
    показать ответ и разбор
    +C)При повороте экран пересоздаётся — теряется ввод или ломается вёрстка

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

  2. #app_lifecycle2 / 5
    Что проверяют в сценарии, когда ОС выгружает приложение из памяти в фоне?
    A)Что приложение редко выгружается системой из фона
    B)Что при выгрузке все пользовательские данные безвозвратно удаляются
    C)Что выгрузка происходит строго через одинаковое время у всех устройств
    D)Что при возврате приложение восстанавливает нужный экран и незавершённое состояние
    показать ответ и разбор
    +D)Что при возврате приложение восстанавливает нужный экран и незавершённое состояние

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

  3. #app_lifecycle3 / 5
    Что проверяют, если сеть пропала посреди операции (например, отправки формы)?
    A)Что приложение сообщает об ошибке и не теряет и не дублирует данные при повторе
    B)Что приложение молча закрывается вплоть до восстановления сети
    C)Что операция всё равно завершается успешно независимо от наличия сети
    D)Что данные будут отправляться повторно сами, без ведома пользователя, бесконечно долго
    показать ответ и разбор
    +A)Что приложение сообщает об ошибке и не теряет и не дублирует данные при повторе

    // разбор: Потеря сети посреди операции — типовой мобильный кейс. Приложение должно поймать ошибку, понятно сообщить, сохранить введённое, дать корректный повтор — и при этом не создать дубль (например, два одинаковых платежа/заказа). Здесь всплывает идемпотентность на бэкенде и аккуратная обработка ретраев на клиенте. Тестировщик рвёт сеть (авиарежим, дросселирование) в разные моменты и проверяет данные после восстановления — нет потерь и дублей.

  4. #app_lifecycle4 / 5
    Почему обновление приложения — отдельный важный сценарий, а не «просто новая версия»?
    A)После обновления приложение стартует как при первой установке
    B)Надо проверить миграцию данных и настроек со старой версии на новую
    C)Обновление удаляет все данные пользователя, и это ожидаемое поведение
    D)Новая версия по определению не может содержать регрессий в старом функционале
    показать ответ и разбор
    +B)Надо проверить миграцию данных и настроек со старой версии на новую

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

  5. #app_lifecycle5 / 5
    Что тестировщику важно проверить в работе deep links (диплинков)?
    A)Что диплинк открывает приложение только когда оно уже запущено в фоне
    B)Что диплинк ведёт себя одинаково даже без установленного приложения
    C)Открытие нужного экрана из разных состояний и фолбэк, если приложение не установлено
    D)Что диплинки полностью заменяют собой push-уведомления
    показать ответ и разбор
    +C)Открытие нужного экрана из разных состояний и фолбэк, если приложение не установлено

    // разбор: Deep link — ссылка, ведущая сразу на конкретный экран приложения (товар, чат, акция). Проверяют переход из разных состояний: приложение закрыто (холодный старт на нужный экран), в фоне, уже открыто; корректность передачи параметров; поведение при неустановленном приложении (фолбэк в стор или на веб); битые и подделанные ссылки (безопасность). Диплинки часто идут из пушей, писем, рекламы — точка входа, которую легко сломать при рефакторинге навигации.

дальше

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

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