Как тестировать поведение приложения при повороте телефона, масштабировании, блокировке и разблокировке устройства?
Что проверяют
Понимаете ли вы, что за поворотом экрана и блокировкой стоят смена конфигурации и жизненный цикл, а не просто «картинка перевернулась». Следом обычно спрашивают, что конкретно может потеряться при повороте и как вы это поймаете.
Как отвечать
Начните с механики. На Android поворот, смена размера шрифта, темы или языка по умолчанию пересоздают Activity: она проходит onPause, onStop, onDestroy и заново onCreate. Всё, что не сохранено во ViewModel или через onSaveInstanceState, теряется. На iOS экран не пересоздаётся, но меняются size classes и раскладка, а при блокировке приложение уходит в фон, и система может его выгрузить.
Каркас проверок:
- поворот: введённый текст, позиция скролла, открытый диалог, выбранная вкладка, видео и прогресс загрузки остаются на месте. Поворачивайте в середине действия: во время запроса, с открытой клавиатурой, на шаге оплаты;
- масштабирование: крупный системный шрифт и масштаб экрана (Display size на Android, Dynamic Type на iOS). Текст не обрезается, кнопки не уезжают за край и остаются нажимаемыми;
- блокировка: сессия и таймеры ведут себя корректно, запрос не уходит дважды, камера и микрофон освобождаются и возвращаются, после долгой паузы токен обновляется;
- выгрузка в фоне: на Android включите в опциях разработчика «Не сохранять действия» (Don’t keep activities), это быстрый способ воспроизвести восстановление после убийства процесса.
Инструменты: эмулятор и Xcode Simulator с кнопками поворота, adb shell settings put system user_rotation 1 при выключенном автоповороте, Appium для автоматизации. Утечки при многократном повороте видны в Android Studio Profiler и через LeakCanary.
Где спотыкаются
Поворачивают только пустой экран. Баги живут в состояниях: заполненная форма, открытая шторка, запрос в процессе.
Путают блокировку с закрытием приложения. После разблокировки приложение не должно заново показывать сплэш и сбрасывать шаг сценария.
Не проверяют пересоздание процесса. Поворот работает, а после выгрузки из памяти приложение падает, потому что состояние лежало в статическом поле.