Как проверить сохранение значения в поле ввода при смене конфигурации устройства?
Что проверяют
Понимаете ли вы, что такое смена конфигурации на мобильном устройстве и почему при ней теряются данные. Интервьюер ждёт не «проверю в разных браузерах», а поворот экрана, смену темы и языка, выгрузку процесса. Следом обычно спрашивают, как это автоматизировать.
Как отвечать
Сначала механизм: на Android при смене конфигурации Activity по умолчанию уничтожается и создаётся заново. Всё, что разработчик не сохранил, пропадает. Отсюда список триггеров:
- поворот экрана: базовый случай, туда и обратно;
- размер окна: разделённый экран, складные устройства, планшеты;
- тема и язык: тёмная тема (
adb shell cmd uimode night yes), смена языка системы; - масштаб шрифта:
adb shell settings put system font_scale 1.3; - смерть процесса: приложение свернули, и система выгрузила его из памяти. Опция
Don't keep activitiesв параметрах разработчика уничтожаетActivityпри уходе с экрана, аadb shell am kill <пакет>убивает процесс свёрнутого приложения.
После каждого триггера смотрите текст в поле, положение курсора, отмеченные чекбоксы, открытый диалог, прокрутку, ошибки валидации. Отдельно поля, где сохранение запрещено требованиями безопасности.
Автоматизация: в Espresso пересоздание вызывается через ActivityScenario.recreate(), в UI Automator поворот через UiDevice.setOrientationLeft(), в Appium есть команда смены ориентации.
В вебе аналог это смена ширины окна. Если на мобильной и десктопной ширине рендерятся разные компоненты формы, при переходе через брейкпоинт введённое значение теряется.
Где спотыкаются
Проверяют только поворот. Тёмная тема или смерть процесса ломают то же самое, но их почти никто не пробует.
Тестируют там, где поворот заблокирован настройками или манифестом приложения. Значение «сохранилось», потому что пересоздания не было.
Не могут объяснить, почему одно поле сохраняется, а соседнее нет. У стандартного EditText текст восстанавливается автоматически, только если у View задан android:id, а в Compose состояние переживает пересоздание с rememberSaveable, но не с remember.