Какие особенности мобильного тестирования: устройства/версии/сеть важно учитывать?
Middle
В мобильном тестировании учитываю матрицу устройств, версии ОС, разрешения, качество сети и системные прерывания.
Проверяю сценарии установки, обновления, работу в фоне, push-уведомления и поведение при смене ориентации.
Из практики: большинство «неуловимых» дефектов появляется на старых устройствах и нестабильной сети.
Частые ошибки
Только эмуляторы без реальных девайсов.
Нет тестов возврата из background.
Дополнительные вопросы
Как собираете логи?
Как проверяете пуши/deeplink?
Как проверить установку, обновление, удаление приложения и миграцию данных?
Junior
Сценарии установки: чистая установка, установка при нехватке места, обновление через Store с сохранением данных, даунгрейд на предыдущую версию.
Миграция данных: сохранность пользовательских настроек и локального кэша при обновлении, совместимость форматов внутренней БД приложения между версиями.
Из практики: самый частый дефект при обновлении — потеря данных при миграции внутренней БД. Проверяю обновление с минимально поддерживаемой версии, а не только с предыдущей.
Частые ошибки
Нет проверки миграций.
Пропускают кейсы с ограниченными правами.
Дополнительные вопросы
Как протестируете миграцию схемы БД?
Поведение при запрете разрешения?
Как тестировать приложение при плохой сети?
Middle
Проверяю сценарии: медленная сеть (3G/Edge), кратковременная потеря соединения, переключение между Wi-Fi и мобильным интернетом в процессе операции.
Смотрю, как приложение сообщает пользователю о проблеме, можно ли безопасно повторить действие и не создаст ли повтор дублей (например, двойная оплата).
Из практики: переключение между сетями в середине критичного действия — один из самых частых источников дефектов на мобильных устройствах. Проверяю этот сценарий отдельно.
Что проверить при входящем звонке во время критичного сценария?
Middle
Я проверяю, сохраняется ли состояние экрана и данные, если сценарий прервался звонком или уведомлением.
После возврата смотрю, можно ли продолжить действие без потери введённых данных.
Из практики: критично проверить, что после возврата не рвется транзакция и не дублируется действие.
Частые ошибки
Не тестируют сценарии прерывания системными событиями.
Дополнительные вопросы
Какие системные прерывания нужно учесть кроме звонка?
Какие проверки сделать для разрешений мобильного приложения?
Middle
Проверяю поведение при разрешении доступа, при отказе и при повторном запросе: к камере, геолокации, микрофону, уведомлениям и контактам.
Смотрю, как приложение работает, если разрешение отозвали позже в системных настройках — ключевые функции должны деградировать gracefully, а не падать с ошибкой.
Из практики: при отказе в разрешении приложение должно объяснить, зачем оно нужно, и предложить путь в настройки — проверяю, что этот флоу работает и не ведёт в тупик.
Частые ошибки
Не тестируют отзыв разрешений после установки.
Дополнительные вопросы
Какие функции должны работать даже без разрешения?
Как тестировать восстановление сессии после перезапуска приложения?
Middle
Проверяю, остаётся ли пользователь в системе после перезапуска и корректно ли восстанавливается состояние экрана.
Отдельно тестирую просроченную сессию и сценарий, когда токен нужно обновить.
Из практики: ошибки с сессией чаще всего проявляются после обновления приложения или смены сети.
Частые ошибки
Тестируют только «чистый» запуск без старого состояния.
Дополнительные вопросы
Какие проверки добавите для истёкшего токена?
Как проверять deep link и универсальные ссылки в мобильном приложении?
Middle
Проверяю открытие нужного экрана из разных источников: браузер, мессенджер, почта, push.
Смотрю поведение при неустановленном приложении, неверной ссылке и устаревшей версии.
Из практики: чаще всего ломается переход в нужный экран после авторизации.
Частые ошибки
Проверяют только один сценарий открытия ссылки.
Дополнительные вопросы
Какие кейсы обязательны для невалидной ссылки?
Какие проверки сделаете для push-уведомлений в разных состояниях приложения?
Middle
Проверю получение и обработку уведомления в активном, свернутом и закрытом приложении.
Проверю переход по нажатию, корректность данных и отсутствие дублей.
Из практики: критичные ошибки часто связаны с переходом по уведомлению в неподготовленное состояние приложения.
Частые ошибки
Не проверяют сценарий с закрытым приложением.
Дополнительные вопросы
Что проверите для уведомлений после переустановки?
Что такое Appium и для каких задач его используют?
Junior
Appium — это фреймворк для автоматизации мобильных, веб- и гибридных приложений на iOS и Android по протоколу WebDriver. Он реализует тот же интерфейс, что и Selenium, поэтому опыт UI-автоматизации легко переносится.
Под капотом Appium общается с системными драйверами: на Android это UiAutomator2 (или Espresso), на iOS — XCUITest. На сервере Appium собирает команды и проксирует их.
Из практики: один и тот же тест-код можно прогнать против Android и iOS, поменяв только capabilities. Это снижает порог входа для команд, которые уже знают Selenium.
Частые ошибки
Считать, что любой Selenium-локатор сработает в Appium — у мобильных есть свои стратегии (accessibility id, predicate).
Запускать Appium без понимания, что нужен установленный SDK Android и/или Xcode.
Дополнительные вопросы
Чем UiAutomator2 отличается от Espresso?
Что такое Appium Inspector?
Что такое capabilities в Appium и какие из них обязательны?
Junior
Capabilities — это набор параметров, который клиент передаёт серверу при создании сессии. Они описывают, на каком устройстве и приложении тестировать.
Обязательные обычно: platformName (Android/iOS), automationName (UiAutomator2, XCUITest), deviceName, и либо app (путь к APK/IPA), либо bundle/package + activity для уже установленного приложения.
Из практики: capabilities передают через JSON или билдер. На реальных устройствах добавляют udid; на эмуляторах — platformVersion и avd. В команде их часто выносят в фабрику окружений.
Частые ошибки
Указывать app и одновременно appPackage — поведение неоднозначное.
Забыть udid и подключиться не к тому устройству, когда их несколько.
Дополнительные вопросы
Чем noReset отличается от fullReset?
Как настроить capabilities для запуска браузера на устройстве?
Какие стратегии поиска элементов есть в Appium?
Middle
Общие: id, xpath, class name, css selector (для web). Платформенные: accessibility id (универсально и стабильно), -android uiautomator (UiAutomator-выражения), -ios predicate string / -ios class chain (для iOS).
Самые стабильные — accessibility id (если разработчики проставляют) и id ресурса (resource-id на Android, name/id на iOS).
Из практики: XPath на мобильных особенно медленный — иерархия большая. Использовать только когда других вариантов нет. Готовое требование к разработчикам: проставлять accessibility-метки.
Частые ошибки
Полагаться на XPath с индексом — он ломается при малейшем изменении вёрстки.
Использовать локализованный текст как локатор — поплывёт при смене языка.
Дополнительные вопросы
Чем accessibility id лучше xpath?
Когда оправдан -ios class chain?
Чем нативное приложение отличается от гибридного и веб-приложения с точки зрения автоматизации?
Middle
Нативное — это приложение, написанное под конкретную платформу (iOS/Android). UI рендерится нативными компонентами, доступ через UiAutomator2 или XCUITest.
Веб-приложение запускается в обычном мобильном браузере, тестируется как обычный сайт через chromedriver/safaridriver.
Гибридное — нативный контейнер с WebView внутри. Чтобы тестировать UI внутри WebView, нужно переключить контекст: driver.context('WEBVIEW_...'). Из практики: для гибридов часто половина теста — в NATIVE_APP, половина — в WEBVIEW.
Частые ошибки
Забыть переключить контекст и пытаться искать WebView-элементы как нативные.
Не настроить debuggable у Android-приложения и не увидеть WebView.
Дополнительные вопросы
Что нужно настроить в нативном приложении для тестирования WebView?
Чем react-native приложение ближе — к нативному или гибридному?
Что такое Appium Inspector и для чего его используют?
Junior
Appium Inspector — это GUI-инструмент, который подключается к запущенной сессии Appium и показывает дерево элементов приложения, их атрибуты и предлагает локаторы.
Также позволяет «прокликивать» приложение и записывать действия, по аналогии с Selenium IDE.
Из практики: основной инструмент, чтобы найти подходящий локатор для элемента. Запускают Appium сервер, потом Inspector, указывают capabilities, открывают приложение и кликают на элементы.
Частые ошибки
Полагаться на сгенерированные XPath без правки — они почти всегда хрупкие.
Не закрыть сессию Inspector и удивляться, что её занимает что-то ещё.
Дополнительные вопросы
Какой ещё инструмент даёт похожие возможности на Android?
Можно ли подключить Inspector к уже идущему тесту?
Как имитировать жесты (свайп, тап, долгое нажатие) в Appium?
Middle
Современный путь — W3C Actions: создаётся последовательность с PointerInput, можно описать тап, долгое нажатие, свайп, drag-and-drop, мульти-тач.
Для удобства есть готовые мобильные команды: driver.executeScript('mobile: swipe', {...}) или 'mobile: tap', 'mobile: longClickGesture'. Они обёртки над платформенными жестами и работают быстрее, чем синтез на низком уровне.
Из практики: для типичных свайпов и тапов используют mobile: команды — они компактнее и стабильнее. Многошаговые жесты пишут через W3C Actions.
Частые ошибки
Использовать устаревший TouchAction API — он deprecated.
Считать координаты в пикселях независимо от плотности экрана.
Дополнительные вопросы
Чем W3C Actions лучше старого TouchAction?
Как настроить координаты с учётом плотности экрана?
Как тестировать на эмуляторе и реальном устройстве, какие различия?
Middle
Эмулятор/симулятор быстрее запускать, проще автоматизировать, удобно в CI. Реальное устройство показывает поведение под нагрузкой, проблемы с разными производителями, реальную работу с камерой/Bluetooth/жестами системы.
Различия: на эмуляторе нет настоящей сети мобильного оператора, разный набор API, иногда отличается рендеринг. На устройстве — настройка USB-отладки (Android) или provisioning profile (iOS).
Из практики: smoke и регрессии чаще гоняют на эмуляторах для скорости, перед релизом — на парке реальных устройств (фермы устройств: BrowserStack, Sauce Labs, или собственные).
Частые ошибки
Запускать релиз только на эмуляторах — пропустить специфичные баги на флагманах OEM.
Не учитывать различия version-fragmentation Android.
Дополнительные вопросы
Что такое device farm и зачем он?
Чем iOS Simulator отличается от Android Emulator с точки зрения автотестов?
Что такое resource-id на Android и почему он удобен?
Junior
resource-id — это уникальный идентификатор элемента в XML-разметке Android-приложения, формат com.example.app:id/login_button. Видно через Layout Inspector или Appium Inspector.
Локатор устойчив к изменениям текста и положения на экране, потому что задаётся разработчиком как часть кода.
Из практики: если у разработчиков нет accessibility id, resource-id — следующий по приоритету выбор. Внутри Appium ищется через стратегию id.
Частые ошибки
Использовать resource-id, который генерируется (R.id.text2 в release-сборке после обфускации) — может пропасть.
Полагаться, что resource-id есть у всех элементов — динамически созданные часто без него.
Дополнительные вопросы
Что такое content-desc на Android?
Чем resource-id отличается от content-desc?
Что такое accessibility id и почему он лучше для тестов?
Junior
Accessibility id — это идентификатор для функций доступности (скринридеры, кнопки голоса). На Android это content-desc, на iOS — accessibilityIdentifier. В Appium ищется единой стратегией accessibility id.
Преимущество: один и тот же ключ работает на iOS и Android — кросс-платформенные тесты получают универсальный локатор. Заодно улучшается доступность приложения для пользователей.
Из практики: лучшая инвестиция в автоматизацию — договориться с разработчиками проставлять accessibility id на все интерактивные элементы. Тесты становятся радикально стабильнее.
Частые ошибки
Использовать переводимые строки в качестве accessibility id — поломка локализации.
Делать одинаковый id на нескольких элементах — поиск будет неоднозначным.
Дополнительные вопросы
Как выставить accessibility id в SwiftUI?
Что такое testTag в Jetpack Compose?
Что такое UiAutomator2 и XCUITest и зачем они нужны Appium?
Middle
UiAutomator2 — это драйвер Google для автоматизации Android UI. XCUITest — драйвер Apple для iOS. Оба — фреймворки нативного уровня, идущие в комплекте с SDK.
Appium общается с ними через свои adapter-серверы (например, appium-uiautomator2-driver), которые ставят на устройство специальный helper-сервис и переводят WebDriver-команды в native-команды.
Из практики: на современных Appium 2.x драйверы устанавливаются как плагины через appium driver install. Для большинства задач хватает UiAutomator2 на Android и XCUITest на iOS.
Частые ошибки
Использовать старый UiAutomator (v1) — поддержка прекращена.
Считать XCUITest универсальным — он работает только на iOS/iPadOS/tvOS.
Дополнительные вопросы
Что такое Espresso-driver?
Как ставится драйвер в Appium 2?
Как переключать ориентацию экрана и работать с системными диалогами?
Middle
Ориентация: driver.rotation = ScreenOrientation.LANDSCAPE. Работает на эмуляторах и (с ограничениями) на реальных устройствах.
Системные диалоги (разрешения, push) перехватывают через mobile:команды: 'mobile: acceptAlert', 'mobile: dismissAlert'. Часто проще выдать разрешения через capabilities: autoGrantPermissions: true (Android) или autoAcceptAlerts (iOS).
Из практики: разрешения, всплывающие в первый запуск приложения, мешают тестам — лучше включать автоприём в capabilities. Для системных уведомлений и звонков иногда нужен переключатель контекста на NATIVE_APP.
Частые ошибки
Делать тест, у которого первое действие — нажать «разрешить», но разрешение уже выдано — таймаут.
Полагаться на ориентацию там, где приложение её не поддерживает.
Дополнительные вопросы
Как выдать разрешения только на конкретный тест?
Можно ли управлять системными настройками устройства из теста?
Как устроена архитектура Appium на верхнем уровне?
Middle
Тест-код (на любом языке с WebDriver-клиентом) обращается к Appium-серверу по HTTP. Сервер парсит запрос, выбирает подходящий драйвер (UiAutomator2, XCUITest, Espresso, Mac, Windows) и проксирует команды этому драйверу.
Драйвер общается с устройством через свой канал: ADB и UiAutomator2-сервер на Android, WebDriverAgent на iOS. Устройство выполняет действие и возвращает результат.
Из практики: эта слоёная архитектура объясняет задержки. Каждый шаг (тест → Appium → driver → device) добавляет миллисекунды, поэтому мобильные тесты ощутимо медленнее десктоп-веб.
Частые ошибки
Считать, что Appium «как Selenium» — задержки и поведение мобильного устройства имеют свои особенности.
Запускать Appium на той же машине, что и эмулятор, без учёта ресурсов.
Дополнительные вопросы
Что такое WebDriverAgent?
Что делает adb в этой цепочке?
Чем noReset, fullReset и обычный сброс приложения отличаются?
Middle
По умолчанию (noReset=false, fullReset=false) Appium сбрасывает состояние приложения — на Android очищает его данные (pm clear), не удаляя само приложение. noReset=true оставляет прежнее состояние и ничего не чистит.
fullReset=true — полная очистка: приложение удаляется и переустанавливается (Android — uninstall перед сессией и после неё, iOS — глубокая очистка). noReset быстрее, fullReset дольше, но гарантирует чистоту.
Из практики: для большинства проектов оптимально дать сценарию свою подготовку (логин, очистка) и не делать fullReset на каждом тесте. Полная переустановка — для smoke первого запуска.
Частые ошибки
Включать noReset и удивляться, что тесты «зависят друг от друга».
Включать fullReset и медленно прогонять регрессию.
Дополнительные вопросы
Как очистить кеш приложения без переустановки?
Когда нужен fullReset?
Как делать скриншоты и записывать видео в Appium?
Middle
Скриншот: driver.getScreenshotAs(...). Простая команда, доступная всегда. Имеет смысл прикладывать к отчёту падения.
Видео: driver.startRecordingScreen() в начале, driver.stopRecordingScreen() в конце — возвращает Base64 mp4. На Android и iOS работает с разными ограничениями (на iOS Simulator до недавнего времени видео не записывалось из коробки).
Из практики: для упавших тестов автоматическое сохранение скриншота и видео сильно облегчает разбор. В фреймворках вроде JUnit/TestNG это вешают на @AfterEach с проверкой статуса.
Частые ошибки
Записывать видео всех тестов — мегабайты артефактов и замедление.
Хранить Base64 в логах вместо сохранения в файл.
Дополнительные вопросы
Как ограничить длину записи?
Чем отличается screenshot и screen recording с точки зрения отладки?
Как тестировать deep links и URL-схемы?
Middle
На Android запускают приложение по URL через adb или через mobile-команду: driver.executeScript('mobile: deepLink', { url: 'myapp://path' }). На iOS — аналогично mobile: deepLink или через Safari.openUrl.
Это позволяет проверить, что приложение правильно открывается из ссылок (email-письма, share, push), и сразу попасть в нужный экран.
Из практики: deep linking тесты заменяют долгие сценарии «свайп-свайп-кнопка». Каждое появление новой ссылки — отдельная проверка.
Частые ошибки
Открывать deep link, когда приложение в фоне в неправильном состоянии — может не сработать.
Не учитывать, что universal links требуют установленных Associated Domains.
Дополнительные вопросы
Чем universal link отличается от custom URL scheme?
Как протестировать переход в приложение из email-клиента?
Что такое appium driver и плагины в Appium 2?
Middle
В Appium 2.x ядро сервера отделено от драйверов. Драйвер для каждой платформы (uiautomator2, xcuitest, espresso, mac2, windows) устанавливается отдельной командой: appium driver install uiautomator2.
Из практики: это разделение позволяет обновлять драйверы независимо от ядра и не таскать ненужные. Минус — нужно явно ставить, иначе сервер не знает про платформу.
Частые ошибки
Поставить только сервер, забыв про драйвер, и получить «No driver matches platformName».
Использовать несовместимые версии драйвера и сервера.
Дополнительные вопросы
Как обновить драйвер?
Какие плагины полезны на старте?
Какие подводные камни тестирования на iOS с XCUITest?
Middle
Запуск возможен только на macOS — нужны Xcode и WebDriverAgent. Сборка приложения требует подписи (developer profile, simulator-сертификат).
Симулятор и реальное устройство имеют разные ограничения: на симуляторе нет камеры, Bluetooth, push с APNS работает условно. Контроль доступа к фото/контактам отличается.
Из практики: для iOS-автоматизации обязательно нужен Mac в CI (или фарма). Установка WebDriverAgent на реальное устройство требует доступа к Apple Developer и иногда танцев с подписью.
Частые ошибки
Думать, что iOS-тесты можно гонять на Linux-раннере.
Не обновлять WebDriverAgent после смены Xcode.
Дополнительные вопросы
Как поставить WebDriverAgent на реальное устройство?
Чем отличаются capabilities для симулятора и реального iPhone?
Как организовать ожидания и стабильные тесты в Appium?
Middle
Использовать явные ожидания (WebDriverWait/FluentWait) с понятными условиями: ExpectedConditions.elementToBeClickable, visibilityOfElementLocated, presenceOfElementLocated.
Избегать Thread.sleep и хардкодных пауз. Для долгих анимаций и переходов между экранами поднимают timeout, но не на «все случаи жизни».
Из практики: типовая ошибка — pageObjects тонут в фиксированных sleep. Когда тестов становится много, прогон растёт на минуты. Замена на ожидания по состоянию сразу даёт +30-50% скорости.
Частые ошибки
Использовать implicit wait и explicit wait одновременно — поведение становится непредсказуемым.
Полагаться, что элемент уже на экране, без проверки.
Дополнительные вопросы
Чем implicit wait опасен в Appium?
Как написать своё ожидание для специфичного состояния?
Как организовать запуск Appium-тестов в CI?
Middle
Базовая схема: установить Node и Appium, поставить нужные драйверы, запустить эмулятор (или подключиться к фарме устройств), стартовать Appium-сервер в фоне, запустить тесты, собрать артефакты (логи Appium, скриншоты, видео).
На Linux можно поднимать Android-эмулятор (с KVM). Для iOS нужен раннер на macOS. Альтернатива — использовать облачные фермы (BrowserStack, Sauce Labs, AWS Device Farm).
Из практики: первое, что стоит автоматизировать — установка зависимостей и запуск Appium-сервера. Дальше — управление эмулятором через скрипты (avdmanager, emulator -avd). Каждый прогон в чистой среде.
Частые ошибки
Полагаться на shared эмулятор между параллельными джобами — гонки.
Не сохранять логи Appium при падении — потом ничего не понять.
Дополнительные вопросы
Что такое appium server logs и как их прочитать?
Чем облачные фермы помогают команде?
Какие альтернативы Appium есть и когда их выбирать?
Middle
Espresso (Android) и XCUITest (iOS) — нативные фреймворки разработчиков. Они быстрее и стабильнее Appium, но пишутся отдельно под каждую платформу.
Detox — фреймворк для React Native, ориентированный на синхронизацию с приложением. Maestro — современный кроссплатформенный фреймворк на YAML с упрощённым синтаксисом.
Из практики: если команда — нативные разработчики, часто выбирают Espresso/XCUITest. Если есть QA-инженеры и кросс-платформа важна — Appium или Maestro. Detox — типичный выбор для React Native.
Частые ошибки
Менять фреймворк под каждый новый проект — у команды не растёт компетенция.
Считать любой кроссплатформенный инструмент равным нативному — каждый имеет свои особенности.
Дополнительные вопросы
Чем Maestro отличается от Appium?
Когда стоит выбрать Espresso вместо Appium?
Чем тестирование мобильных приложений отличается от веба?
Junior
Главные отличия: огромная фрагментация устройств и версий ОС, особенности интерфейса (тачи, жесты, разные экраны), особые сценарии (звонки, разряд батареи, потеря сети), магазины (Google Play, App Store) с их правилами, требования к производительности и батарее.
Также мобильное приложение работает в условиях, когда система может его выгрузить из памяти, переключить в фон, отозвать разрешения. Тесты учитывают это.
Из практики: помимо UI и API, в чек-листы добавляют сценарии перехода в фон, прерываний (входящий звонок, push, выключение экрана), работы в офлайн, разных уровней яркости/доступности.
Частые ошибки
Тестировать только золотую модель устройства и пропускать редкие модели.
Игнорировать жесты системы (свайп назад на iOS, кнопка назад на Android).
Дополнительные вопросы
Какие виды прерываний обязательны в тест-плане?
Чем тестирование под Android сложнее, чем под iOS?
Как проверить поведение приложения при потере сети?
Junior
Включают авиарежим, отключают Wi-Fi, ослабляют сигнал (через эмулятор или сетевую утилиту), имитируют медленную сеть (Charles, Network Link Conditioner, эмулятор Android).
Проверяют: понятное сообщение пользователю, повтор запроса при возврате сети, корректное состояние UI (нет вечного спиннера), сохранение черновика данных.
Из практики: типовые баги — приложение «зависает» в загрузке, теряет введённые данные при попытке отправки, не повторяет автоматически и требует ручного действия. Тесты на офлайн — обязательная часть приёмки.
Частые ошибки
Считать, что если приложение упало — это редкий кейс. Сеть на телефоне отваливается постоянно.
Не проверять восстановление после возврата сети — баги бывают именно там.
Дополнительные вопросы
Чем эмуляция медленной сети полезнее простого отключения?
Какой кейс приоритетнее — нет сети при старте или потеря в середине сценария?
Что такое прерывания и как их тестировать?
Junior
Прерывание — это любое событие, отвлекающее приложение: входящий звонок, push, будильник, низкий заряд, потеря сети, переход в фон по нажатию Home.
Тест-кейс: воспроизвести прерывание в ключевые моменты (оплата, ввод формы, загрузка) и проверить, что после возврата состояние корректно. Особое внимание — данным, которые не должны потеряться.
Из практики: для типового приложения проверяют как минимум: звонок при оплате, push в момент загрузки, переход в фон во время длительной операции, разрыв сети при отправке.
Частые ошибки
Тестировать прерывания только на главном экране — пропустить баг в редком переходе.
Считать, что прерывания всегда обрабатываются ОС — нет, приложение должно сохранять состояние явно.
Дополнительные вопросы
Чем фоновый режим отличается от убитого процесса?
Что такое state restoration?
Как проверить адаптивность приложения под разные экраны?
Junior
Используют набор устройств с разными разрешениями и плотностями (DPI), от компактного 4-дюймового до 6.7" и планшетов. На iOS — iPhone SE, обычный, Pro, iPad. На Android — несколько производителей и версий.
Проверяют: не обрезаются ли тексты, не наезжают ли элементы, корректно ли работают модальные окна, как ведёт себя ландшафтная ориентация.
Из практики: больше всего вытекает текст у длинных языковых вариантов (немецкий, русский, языки RTL), у мелких экранов или системного крупного шрифта (Dynamic Type на iOS).
Частые ошибки
Тестировать только в нормальном размере шрифта и не ловить overflow при больших.
Игнорировать iPad — поведение на нём часто отличается.
Дополнительные вопросы
Что такое safe area и почему о ней важно знать?
Как проверить тесты с системным крупным шрифтом?
Как тестировать жесты (свайп, pinch, long press)?
Junior
Ручное тестирование — прокликивание всех ключевых жестов на разных устройствах. Особое внимание системным жестам (свайп с края на iOS, gesture-навигация на Android) и их конфликту с приложением.
Из практики: типовые баги — приложение перехватывает системный свайп назад, неправильно реагирует на «pinch to zoom», long press открывает не то меню. Чек-лист жестов фиксируют в тест-плане.
Частые ошибки
Тестировать только основной жест (тап) и пропустить остальные.
Не проверять, что есть альтернатива жесту (кнопка), для доступности.
Дополнительные вопросы
Какой жест должен иметь альтернативу-кнопку?
Как реализовать pinch в автотесте?
Как проверить работу приложения с разрешениями (камера, гео, контакты)?
Middle
Сценарии: первый запуск без разрешения, отказ, отзыв в настройках, повторный запрос. Проверяют, что приложение корректно ведёт себя в каждом случае: показывает понятное объяснение, не падает, предлагает путь в настройки.
На Android разрешения runtime появились с API 23. На iOS встроенный диалог появляется при первом обращении, далее — только через настройки.
Из практики: типовые баги — приложение падает при отказе, показывает заглушку без объяснения, не реагирует на изменение разрешения в настройках.
Частые ошибки
Тестировать только «всё разрешено» и пропустить кейсы отказа.
Не проверять, что приложение умеет работать с ограниченным разрешением (например, частичный доступ к фото на iOS 14+).
Дополнительные вопросы
Что такое 'don't ask again' на Android и как его учитывать?
Как тестировать отзыв разрешения в середине сессии?
Как тестировать push-уведомления?
Middle
Сценарии: получение в активном/фоновом/убитом приложении, открытие уведомления (deep link в нужный экран), badge counter, поведение при отказе от разрешения, при отсутствии сети.
Для отправки тестовых push используют админку проекта, Firebase Cloud Messaging Console, инструменты под APNs.
Из практики: типовые баги — открытие push не ведёт в нужный экран в холодном старте, badge не сбрасывается, push приходит с задержкой и пользователь успевает совершить дублирующее действие.
Частые ошибки
Тестировать только активное приложение — большинство пушей видят в фоне.
Не проверять локализацию текста уведомления.
Дополнительные вопросы
Чем silent push отличается от обычного?
Как протестировать badge counter на iOS и Android?
Что такое холодный старт, тёплый старт и горячий старт приложения?
Middle
Холодный старт — процесс приложения не запущен, ОС поднимает его с нуля, инициализирует, загружает данные. Самый долгий.
Тёплый старт — процесс был, но активити/контроллер пересоздаются. Быстрее.
Горячий старт — приложение в памяти и возвращается из фона без пересоздания. Самый быстрый.
Из практики: метрика time-to-interactive холодного старта — ключевая для пользовательского опыта. Цель — обычно 1-2 секунды на флагмане, 3-4 на бюджетке.
Частые ошибки
Замерять только тёплый старт — на проде первое впечатление от холодного.
Не учитывать, что холодный старт ухудшается с ростом числа SDK на старте.
Дополнительные вопросы
Какие метрики смотреть для оценки старта на Android?
Что такое App Launch Time в Xcode Instruments?
Как тестировать локализацию приложения?
Middle
Проверяют все поддерживаемые языки: переводы корректны, не обрезаются, влезают в кнопки, корректные форматы дат, чисел, валюты. Для RTL-языков (арабский, иврит) проверяют разворот раскладки и иконок.
На iOS меняют язык приложения отдельно от системы (с iOS 13). На Android — системный язык, дублированные ресурсы по локалям.
Не тестировать RTL — там часто скрытые баги в раскладке.
Дополнительные вопросы
Что такое pseudo-локализация?
Как протестировать форматы чисел в разных локалях?
Что такое доступность (accessibility) в мобильных приложениях и как её проверить?
Middle
Доступность — это возможность пользоваться приложением для людей с ограничениями зрения, слуха, моторики. Главное на мобильных: совместимость со скринридерами (VoiceOver на iOS, TalkBack на Android), управление крупным шрифтом, контрастные цвета.
Проверяют: каждый интерактивный элемент имеет осмысленное название (accessibility label), порядок чтения логичен, есть фокус и кнопка не «глотает» содержимое.
Из практики: чек-лист — пройти основные сценарии включённым VoiceOver/TalkBack, включить «крупный текст», «увеличение контраста», «уменьшить движение».
Частые ошибки
Сделать кнопку как иконку без label — скринридер прочитает «кнопка» и всё.
Использовать только цвет для индикации ошибки — недоступно дальтоникам.
Дополнительные вопросы
Какие инструменты помогают аудиту доступности?
Что такое WCAG и как он применим к мобилке?
Как тестировать работу приложения при изменении системного шрифта/масштаба?
Middle
Меняют системный размер шрифта на максимальный (Dynamic Type на iOS, размер шрифта в Android Accessibility) и проходят основные сценарии. Также часто есть «масштаб экрана» — увеличивает все элементы.
Проверяют: тексты не обрезаются, кнопки остаются нажимаемыми, формы работают, прокрутка появляется там, где раньше всё помещалось.
Из практики: типовые баги — фиксированная высота строк, обрезание заголовка, налезание на другие элементы. Лучше делать раскладку с учётом наибольшего размера.
Частые ошибки
Не учитывать масштаб экрана — это отдельная от шрифта настройка.
Тестировать только в обычном размере и сдавать в релиз.
Дополнительные вопросы
Что такое Dynamic Type на iOS?
Где на Android регулируется масштаб?
Чем тестирование в магазинах (Google Play, App Store) отличается от обычного?
Middle
Помимо функциональности проверяют соответствие правилам: возрастной рейтинг, обработка персональных данных, корректные разрешения, требования к промо-материалам (скриншоты, описание).
Дополнительные сценарии: установка через магазин (а не sideload), обновление с предыдущей версии (миграции данных), in-app покупки в sandbox-режиме.
Из практики: ревью магазина может занимать дни. Отказ из-за мелочи (слишком приватный текст в скриншоте, нечёткая иконка) — обычное дело. Тестировщик отвечает не только за код, но и за метаданные.
Частые ошибки
Игнорировать тест обновления — данные пользователей теряются.
Сдавать релиз без проверки in-app покупок в sandbox.
Дополнительные вопросы
Что такое staged rollout и зачем он?
Как протестировать миграцию данных при апдейте?
Как тестировать платежи и in-app покупки?
Middle
На iOS используют Sandbox-аккаунты в App Store Connect: создают тестового пользователя, входят в Sandbox в настройках устройства, проводят покупку без реальной оплаты.
На Android — тестовые аккаунты в Google Play Console, тестовые карты Google Pay, режимы test для подписок.
Из практики: критичные сценарии — успешная покупка, отмена, восстановление покупок, истечение подписки, повторная попытка после сетевой ошибки. Также проверяют локализованные цены.
Частые ошибки
Тестировать платежи на проде с реальной картой — иногда деньги действительно списываются.
Не проверять восстановление покупок — пользователи теряют доступ при смене устройства.
Дополнительные вопросы
Что такое StoreKit testing на iOS?
Как протестировать сценарий истёкшей подписки?
Какие сценарии аутентификации стоит протестировать в мобильном приложении?
Middle
Базовые: вход по логину/паролю, восстановление, регистрация, выход. Дополнительно: соцсети (OAuth), Apple ID (требование iOS), Google Sign-In, биометрия (Face ID, Touch ID, отпечаток).
Сценарии безопасности: блокировка после нескольких ошибок, истечение сессии, выход после долгого бездействия, поведение при изменении пароля на другом устройстве.
Из практики: важна проверка биометрии (а если её сменили на другую — отозвался ли доступ), и того, что приложение не показывает чувствительные данные в task switcher (скриншот превью).
Частые ошибки
Тестировать вход и забывать выход и истечение сессии.
Не проверять, что приложение скрывает экран при переходе в task switcher.
Дополнительные вопросы
Что такое keychain и keystore с точки зрения тестировщика?
Как протестировать сценарий повторного входа после удалённого выхода?
Как протестировать работу с камерой и галереей?
Middle
Сценарии: съёмка фото и видео, выбор из галереи, переключение камер, флеш, отмена, сжатие, EXIF (геопозиция, ориентация), поведение без разрешения.
Проверяют корректность вращения (часто фото с iPhone приходят повёрнутыми), размер, что превью совпадает с итоговым файлом.
Из практики: типовые баги — фото вверх ногами, потеря данных при переходе в галерею и обратно, OOM при больших файлах, неверная обработка отмены пользователем.
Частые ошибки
Тестировать только на одном устройстве — поведение камер у Samsung и Pixel разное.
Не учитывать ограничения объёма памяти при больших видео.
Дополнительные вопросы
Что такое UIImagePickerController на iOS?
Как обработать EXIF-ориентацию?
Что такое утечка памяти в мобильном приложении и как её обнаружить?
Middle
Утечка — это память, которая занята объектами, на которые сохранились ненужные ссылки, и они не освобождаются сборщиком мусора (Android) или ARC (iOS). Потенциальные источники: статические ссылки на контекст, забытые слушатели, замыкания, удерживающие view.
Инструменты: Android Studio Memory Profiler + LeakCanary, Xcode Instruments (Allocations, Leaks). Открывают сценарий, переходят туда-обратно, смотрят, растёт ли использование памяти.
Из практики: типовая ситуация — листая ленту, видишь рост памяти на сотни МБ. Поиск виновника — снимки кучи в двух точках и сравнение dominator tree.
Частые ошибки
Считать, что утечка обязательно вызовет OOM — может просто замедлять приложение.
Игнорировать leak в редко используемом экране — постепенно набегает.
Дополнительные вопросы
Что такое retain cycle на iOS?
Как использовать LeakCanary?
Как протестировать работу с биометрией?
Middle
Сценарии: первый ввод и сохранение в keystore/keychain, успешная биометрия, отказ (неверный отпечаток), отсутствие настроенной биометрии, отзыв (добавлен/удалён отпечаток), переход к запасному способу (пароль).
Эмуляторы поддерживают эмуляцию биометрии. На iOS Simulator — Features → Face ID. На Android — adb команды или меню эмулятора.
Из практики: критично проверить, что при добавлении нового отпечатка приложение требует повторной аутентификации (защита от подмены). Это требование банков и любых чувствительных приложений.
Частые ошибки
Не проверять сценарий отзыва биометрии — серьёзная дыра безопасности.
Тестировать только успешные кейсы.
Дополнительные вопросы
Что такое invalidatedByBiometricEnrollment?
Как симулировать сбой биометрии?
Чем тестирование Android и iOS отличается на практике?
Middle
Android: высокая фрагментация устройств и версий, разные оболочки производителей (One UI, MIUI, HyperOS), кнопка/жест «назад», runtime-permissions, sideload APK для теста.
iOS: меньше устройств, но строже правила Apple, единый магазин, нет кнопки «назад» (свайп), кардинально иной механизм фоновой работы, требование подписи и provisioning profile.
Из практики: на Android больше комбинаторного покрытия по устройствам/прошивкам. На iOS — больше внимания к деталям UI и правилам ревью. Подход к автоматизации тоже отличается.
Частые ошибки
Считать тест-планы одинаковыми — у каждой платформы свои специфические сценарии.
Игнорировать оболочки производителей на Android.
Дополнительные вопросы
Какой минимум устройств покрыть на Android?
Что нужно учитывать у MIUI/EMUI?
Как тестировать deep links и universal links?
Middle
Создают набор ссылок для каждого важного сценария (открытие профиля, оплата, акция) и проверяют: открываются при тапе в почте/чате, ведут в нужный экран и в холодном, и в горячем старте, не теряют параметры.
На iOS Universal Links требуют файл apple-app-site-association на домене. На Android — App Links через assetlinks.json. Без них откроется браузер, а не приложение.
Из практики: типовые баги — холодный старт не открывает нужный экран, теряются utm-параметры, ссылка ведёт в начальный экран вместо целевого.
Частые ошибки
Тестировать только в одной мессенджере — у каждого свой парсер ссылок.
Не учитывать обновление apple-app-site-association — может кешироваться долго.
Дополнительные вопросы
Чем universal link отличается от custom URL scheme?
Как проверить, что устройство «увидело» нашу App Link?
Что такое обновление приложения через store update и как его тестировать?
Middle
Тестируют: установка с нуля, обновление с предыдущей версии (миграция данных в локальной БД, новые таблицы, переезд настроек), обновление с очень старой версии (несколько шагов миграций подряд).
Также проверяют сценарии in-app update (forced update / soft update на Android) и поведение при отказе пользователя обновляться.
Из практики: миграции БД — частый источник серьёзных багов после релиза. Делают «снимок» данных пользователя на старой версии, потом обновляются и проверяют, что данные на месте.
Частые ошибки
Тестировать только установку с нуля — у реальных пользователей данные с прошлой версии.
Не покрывать сценарии «forced update».
Дополнительные вопросы
Что такое staged rollout и зачем он?
Чем отличается in-app update на Android и iOS?
Как тестировать поведение приложения при низком уровне заряда?
Middle
На Android есть режим энергосбережения, который ограничивает фоновую работу, GPS, push, синхронизацию. На iOS — Low Power Mode, отключающий фоновые задачи и снижающий частоту обновлений.
Сценарии: включить режим энергосбережения и пройти основные потоки, особенно фоновую работу (синхронизация, гео-трекинг, скачивания).
Из практики: типовые баги — приложение продолжает потреблять много энергии в фоне, не уважает Doze/App Standby, push приходит с задержкой. Battery Historian для Android помогает анализу.
Частые ошибки
Не учитывать Doze mode и фоновые ограничения Android.
Считать, что приложение «как работает с зарядкой, так и без».
Дополнительные вопросы
Что такое Doze mode на Android?
Как протестировать Low Power Mode?
Какие виды тестирования специфичны именно для мобильных приложений?
Middle
К стандартным функциональным/нефункциональным добавляются: тестирование на разных устройствах (device coverage), на разных версиях ОС, на разной плотности экрана, тестирование жестов, прерываний, фоновой работы, push, deep links, in-app покупок.
Также есть пилотное распространение через TestFlight / Internal Testing, бета-тесты, проверка в Sandbox для покупок.
Из практики: тест-план для мобильного приложения обычно длиннее, чем для веб-приложения той же сложности, именно из-за платформенной специфики.
Частые ошибки
Скопировать тест-план веб-проекта в мобильный — теряются ключевые сценарии.
Игнорировать стадию beta — там часто всплывают эксклюзивные баги пользователей.
Дополнительные вопросы
Что входит в smoke-чек мобильного релиза?
Чем TestFlight отличается от Internal Testing в Google Play?
Что такое ProGuard/R8 и как они влияют на тестирование?
Middle
ProGuard (старое имя) и R8 (актуальный) — это утилиты, которые в release-сборке Android урезают неиспользуемый код и обфусцируют имена классов/методов. Уменьшают размер APK и затрудняют реверс-инженеринг.
Минус для тестирования: после обфускации reflection и сериализация могут сломаться. Названия классов в логах превращаются в a, b, c.
Из практики: release-сборку обязательно прогоняют через smoke-тесты — обфускация может что-то сломать, что не видно в debug. Для отладки крашей используют mapping.txt для разобфускации стектрейса.
Частые ошибки
Тестировать только debug-сборку и сдавать релиз без проверки.
Терять mapping.txt — потом стектрейсы из прода невозможно прочитать.
Дополнительные вопросы
Что такое R8 full mode?
Как сохранить и восстановить mapping.txt?
Как протестировать сценарий «приложение упало» (краш) и убедиться, что он попадает в систему отчётности?
Middle
Тестируют: специально воспроизводят сценарий, который должен крашить приложение (или используют тестовую кнопку «Force crash»). Проверяют, что отчёт о краше появился в выбранной системе мониторинга (Crashlytics, Sentry, App Center).
Также проверяют группировку (одинаковые краши не плодят дубли), наличие стектрейса, переменных, breadcrumbs.
Из практики: «тестовая кнопка краш» — стандарт. Тестировщик в новой сборке нажимает её и убеждается, что краш виден в админке системы мониторинга через 1-2 минуты.
Частые ошибки
Полагаться, что краш долетит без проверки — пути ошибочны: фоновые задачи, плохая сеть, разработчики могли отключить отправку.
Не сверять mapping.txt — стектрейс будет нечитаемый.
Дополнительные вопросы
Что такое ANR на Android и как его поймать?
Как различать crash и hang в Crashlytics?
Что такое ANR на Android и как с ним бороться?
Middle
ANR (Application Not Responding) — это ситуация, когда главный поток приложения заблокирован дольше определённого времени (обычно 5 секунд для input). Система предлагает пользователю закрыть приложение.
Причины: тяжёлая работа на UI-потоке, ожидание ответа от сети без таймаута, дедлоки, синхронные операции с диском.
Из практики: для отладки используют strict mode, traces.txt в /data/anr, Firebase Crashlytics ANR reports. Тестируют намеренно — открывают приложение на медленной сети и проверяют, что не зависает.
Частые ошибки
Делать сеть/файл на UI-потоке.
Не выставлять таймауты у сетевых запросов.
Дополнительные вопросы
Что такое StrictMode?
Где смотреть traces.txt?
Что такое responsive vs adaptive дизайн?
Middle
Responsive — одна вёрстка, которая плавно подстраивается под любую ширину экрана через CSS-медиа-запросы и гибкие сетки. Adaptive — несколько фиксированных макетов для конкретных breakpoint'ов (mobile, tablet, desktop).
Responsive гибче, adaptive проще оптимизировать под конкретные размеры.
Из практики: большинство современных сайтов — responsive. Adaptive остаётся в кросс-устройстве, где важно зафиксировать макет под устройство.
Частые ошибки
Тестировать только на трёх «стандартных» ширинах — пропустить пограничные.
Не учитывать ландшафтный режим.
Дополнительные вопросы
Что такое breakpoint?
Как тестировать responsive в Playwright?
Какие точки разрыва (breakpoints) типовы для мобильного тестирования?
Также бывает плотность: 1x, 2x, 3x — для retina-экранов. Изображения могут показываться по-разному.
Из практики: 320 — самая «узкая» норма, ниже редко тестируют. 768 — критическая точка перехода телефон/планшет.
Частые ошибки
Не учитывать 320px — пропустить обрезание UI на старых iPhone.
Полагать, что только portrait — landscape тоже нужно проверить.
Дополнительные вопросы
Чем CSS rem отличается от px при тестировании?
Что такое viewport meta?
Как протестировать офлайн-режим в мобильном вебе (PWA)?
Middle
В DevTools браузера есть переключатель Offline в Network. Также можно эмулировать «slow 3G» или вообще «no throttling».
Для PWA проверяют: грузится ли offline shell, работают ли кеш и Service Worker, корректно ли восстанавливается после возврата сети.
Из практики: типовые баги — отсутствие fallback-страницы, бесконечный спиннер, потеря введённых данных при восстановлении.
Частые ошибки
Полагать, что offline-режим в DevTools = реальный офлайн на телефоне.
Не проверять восстановление после возврата сети.
Дополнительные вопросы
Что такое service worker fetch event?
Как протестировать background sync?
Что такое gesture handler и где он может ломаться?
Middle
Gesture handler — компонент, обрабатывающий жесты (свайп, drag, pinch). На Android часто свайп слева — системный «назад», что конфликтует с приложением.
Также есть конфликт между несколькими жестами в одном экране (карусель внутри прокручиваемой страницы).
Из практики: типовые баги — свайп срабатывает только в части экрана, конфликт с системным жестом, проблема с прокруткой внутри карусели.
Частые ошибки
Тестировать жесты на эмуляторе — на реальном устройстве чувствительность разная.
Игнорировать конфликты с системными жестами.
Дополнительные вопросы
Как тестировать swipe-back?
Что такое touch slop?
Что такое safe area и как её тестировать?
Middle
Safe area — область экрана, свободная от системных элементов: нотча (челки), индикатора Home, статус-бара. На iPhone X+ и многих Android-устройствах эта область отличается от полного экрана.
В CSS — env(safe-area-inset-top), в SwiftUI/UIKit — встроенные API.
Из практики: типовые баги — кнопка под Home-индикатором, текст за нотчем, фон не доходит до краёв. Проверяют на устройствах с разной формой экрана.
Частые ошибки
Тестировать только на iPhone SE и не видеть проблем с нотчем.
Игнорировать landscape — там safe area другая.
Дополнительные вопросы
Что такое viewport-fit=cover?
Как обработать safe area в Android Compose?
Как тестировать клавиатуру (показ, скрытие, autocomplete)?
Middle
Сценарии: open/close клавиатуры, перекрывание полей (поле должно проскроллиться), переключение между input через next, типы клавиатур (numeric, email, url), autocorrect/autocapitalize.
Также проверяют интеграции: автозаполнение из менеджера паролей, подсказки браузера.
Из практики: типовые баги — кнопка submit под клавиатурой, autocomplete заполняет не те поля, неправильный тип клавиатуры (буквы вместо цифр).
Частые ошибки
Тестировать только на эмуляторе — реальная клавиатура ведёт себя иначе.
Из практики: 100-150 МБ — норма, 200+ — повод оптимизировать. Также важен initial download — сколько грузится при первом запуске.
Частые ошибки
Подключать большие SDK ради одной функции.
Не использовать App Bundle и качать 'жирный' APK.
Дополнительные вопросы
Что такое Android App Bundle?
Чем app thinning помогает на iOS?
Как тестировать темы (светлая/тёмная/системная)?
Middle
Сценарии: переключение в настройках устройства, в настройках приложения, автоматический переход по системной теме. Проверяют все экраны в обеих темах, контрасты, что не пропали элементы.
Особое внимание — кастомным компонентам, картинкам (иногда нужны варианты для каждой темы), графикам.
Из практики: типовые баги — белый текст на белом фоне в тёмной теме, иконки только для одной темы, диалоги не наследуют тему.
Частые ошибки
Тестировать только в светлой теме — пропустить половину UI-багов.
Полагаться на CSS prefers-color-scheme без проверки на реальном устройстве.
Дополнительные вопросы
Что такое dynamic colors в Material You?
Как протестировать тему в Storybook?
Что такое gesture navigation на Android и как с ней работать?
Middle
С Android 10 есть gesture navigation — нет кнопок «назад», «домой», «обзор». Жесты с краёв экрана выполняют эти функции.
Это создаёт конфликты с приложениями, использующими свайп с края: списки с действиями свайпом, drawer-меню.
Из практики: тестировать обязательно — на устройствах с gesture navigation поведение может отличаться. Решение в коде — exclude rects из системных жестов.
Частые ошибки
Тестировать только с 3-кнопочной навигацией.
Не понимать, как exclude system gestures.
Дополнительные вопросы
Что такое systemGestureExclusionRects?
Чем 3-button navigation отличается от gesture?
Как тестировать локальные уведомления?
Middle
Сценарии: показ уведомления в нужное время, при разных состояниях приложения (активное, фон, убито), переход в нужный экран по клику, корректное отображение текста/иконки/действий.
Также проверяют: badge, звук, вибрация, поведение при отказе от разрешения.
Из практики: типовые баги — уведомление не приходит после ребута устройства, неправильный экран открывается, дублирование уведомлений.
Частые ошибки
Тестировать только активное приложение.
Не проверять состояние после перезагрузки устройства.
Дополнительные вопросы
Чем local notification отличается от push?
Как протестировать notification action button?
Что такое Appium 2 driver и plugin model?
Middle
В Appium 2.x ядро отделено от драйверов. Драйвер устанавливается отдельно: appium driver install uiautomator2. Плагины добавляют функциональность поверх (images, execute-driver).
Это упрощает обновление: можно обновить только драйвер без сервера и наоборот.
Из практики: при настройке CI явно укажите версии драйверов — иначе при обновлении приедет несовместимая.
Частые ошибки
Не установить драйвер вообще — 'no driver matches platformName'.
Использовать несовместимые версии сервера и драйвера.
Дополнительные вопросы
Чем отличается старый All-in-one от Appium 2?
Какие плагины полезны?
Что такое mobile: команды в Appium?
Middle
Это специальные команды, вызываемые через driver.executeScript('mobile: <name>', args). Они дают доступ к платформенным фичам, не входящим в WebDriver-протокол.
Из практики: значительно упрощают сценарии — вместо длинных серий swipe можно одной командой проскроллить до элемента.
Частые ошибки
Использовать deprecated команды без проверки документации.
Делать сложную логику через mobile: shell — теряется переносимость.
Дополнительные вопросы
Какие самые ходовые mobile: команды?
Чем mobile: shell полезен на Android?
Как настроить параллельный прогон Appium-тестов?
Middle
Несколько Appium-серверов на разных портах + по одному устройству/эмулятору каждому. Тесты распределяются между серверами через свои capabilities (udid, systemPort).
Альтернатива — облачные фермы (BrowserStack, Sauce Labs), где параллелизация настроена на их стороне.
Из практики: главное — не путать systemPort у UiAutomator2 — каждой инстанции свой, иначе конфликт.
Частые ошибки
Использовать одинаковый systemPort для двух параллельных Android-тестов.
Не задавать udid и подключаться к случайному устройству.
Дополнительные вопросы
Что такое systemPort?
Чем фермы лучше своих стендов?
Что такое Espresso driver и когда он нужен?
Middle
Espresso — фреймворк автотестов Google для Android. Appium Espresso Driver проксирует WebDriver-команды в Espresso API, давая более глубокий доступ к внутренностям приложения и стабильность.
Минус — нужно встраивать в APK тестовый apk Espresso. UiAutomator2 не требует.
Из практики: Espresso выбирают, когда нужна максимальная стабильность и доступ к внутренностям. UiAutomator2 — когда тестируют чужой APK.
Частые ошибки
Считать, что Espresso Driver работает с любым APK без модификаций.
Игнорировать рост размера сборки.
Дополнительные вопросы
Чем Espresso стабильнее UiAutomator2?
Когда выбрать каждый?
Как запустить Appium-тесты в Docker?
Middle
Готовые образы (например, appium/appium) содержат Appium и Android SDK. Подключаются к запущенному эмулятору на хосте или к удалённой ферме.
Если эмулятор тоже в Docker — нужна поддержка KVM (для x86 эмулятора) и проброс /dev/kvm.
Из практики: в CI часто запускают Appium-сервер в контейнере, а сами тесты — рядом. iOS-тесты в Docker не запустить (нужен macOS-раннер).
Частые ошибки
Запускать ARM-эмулятор без аппаратной поддержки — будет очень медленно.
Не пробрасывать /dev/kvm и работать на эмуляции.
Дополнительные вопросы
Что такое KVM?
Как тестировать iOS в CI?
Как протестировать запуск приложения после ребута устройства?
Middle
Через adb (Android) reboot или специальные mobile-команды. После ребута нужно дождаться, пока система прогрузится, и проверить сценарии: запускается ли приложение, восстанавливаются ли данные, приходят ли push.
Также проверяют автозапуск, если он есть, и поведение фоновых сервисов.
Из практики: после ребута часто всплывают баги с инициализацией — приложение падает, теряет состояние, забывает токен.
Частые ошибки
Тестировать только cold start без ребута.
Не учитывать политику BootReceiver на Android.
Дополнительные вопросы
Что такое BootReceiver?
Чем cold start после ребута отличается от обычного cold start?
Что такое WebDriverAgent и зачем он нужен?
Middle
WebDriverAgent (WDA) — нативное iOS-приложение от Facebook (теперь Meta), реализующее WebDriver-протокол на iOS. Appium iOS-драйвер ставит WDA на устройство и общается с ним.
WDA нужно подписать сертификатом для установки на реальное устройство (development или enterprise).
Из практики: проблемы с WDA — типичная причина неработающих iOS-тестов. Версия WDA должна быть совместима с Xcode и iOS.
Частые ошибки
Использовать устаревший WDA для новой iOS.
Не подписывать WDA правильным сертификатом для реального устройства.
Дополнительные вопросы
Как установить WDA на симулятор?
Чем WDA отличается от XCUITest?
Как обработать всплывающие диалоги системы?
Middle
На Android: autoGrantPermissions: true в capabilities. На iOS: autoAcceptAlerts: true или autoDismissAlerts: true. Точечно — driver.switchTo().alert().accept().
Также есть mobile-команды: 'mobile: acceptAlert', 'mobile: dismissAlert'.
Из практики: лучше выдавать разрешения через capabilities, а не реагировать на каждый pop-up в тесте — тесты стабильнее.
Частые ошибки
Полагаться, что autoGrantPermissions выдаст runtime-разрешения, появляющиеся в середине сценария.
Считать, что accept/dismiss одинаково работают.
Дополнительные вопросы
Чем accept отличается от dismiss?
Как обработать кастомный диалог приложения?
Какие подводные камни у Appium на iOS?
Middle
Тесты на iOS требуют macOS (Xcode, signing). WebDriverAgent нужно подписать. Реальные устройства требуют developer profile. Симулятор не поддерживает камеру, push с APNs работает условно.
Также: задержки запуска WDA на холодном старте, отличия simulator vs real device, ограничения accessibility.
Из практики: бюджет на iOS-инфраструктуру обычно больше, чем на Android. Это нужно закладывать заранее.
Частые ошибки
Игнорировать различия simulator и real device.
Не обновлять WDA при смене версии Xcode.
Дополнительные вопросы
Как сократить время запуска WDA?
Что такое developer disk image?
Как сделать стабильный поиск элементов в Appium?
Middle
Приоритет: accessibility id (кросс-платформенно), resource-id (Android), name/id (iOS). XPath — последнее средство, медленный и хрупкий.
Договариваться с разработчиками о расстановке accessibility-меток. Это инвестиция, окупающаяся стабильностью тестов.
Из практики: проект с правильно расставленными accessibility id — radically стабильные тесты. Без них — постоянная борьба с локаторами.
Частые ошибки
Использовать XPath с индексом — хрупкость.
Полагаться на локализованный текст как локатор.
Дополнительные вопросы
Что такое accessibilityIdentifier в SwiftUI?
Чем content-desc отличается от resource-id?
Что такое cloud device farm (BrowserStack, Sauce Labs, AWS Device Farm)?
Middle
Облачные сервисы, предоставляющие парк реальных и эмулированных устройств. Тесты запускаются на их инфраструктуре через стандартный WebDriver/Appium endpoint.
Преимущество: парк сотен устройств без затрат на железо. Минус: стоимость, сетевая задержка, ограничения по приватности.
Из практики: для команд без большого количества устройств — практически обязательно. Особенно ценно для пред-релизных регрессий на разнообразных устройствах.
Частые ошибки
Хранить чувствительные данные в тестах, идущих в облако.
Не учитывать задержки сети при тестах на облачных устройствах.
Дополнительные вопросы
Чем BrowserStack отличается от Sauce Labs?
Как настроить капабилити для облака?
Как тестировать камеру и галерею в Appium?
Middle
На симуляторе iOS можно дать приложению доступ к фейковой галерее через настройки. На Android — adb push изображения в /sdcard/Pictures.
Для самой камеры — на симуляторе она «фейковая». На реальном устройстве полный тест возможен.
Из практики: для CI часто настраивают фикстуру — подсунуть фото в галерею, открыть приложение, проверить выбор. Сама съёмка тестируется руками на реальных устройствах.
Частые ошибки
Тестировать камеру только на симуляторе.
Не очищать галерею между тестами — состояние накапливается.
Дополнительные вопросы
Как смокать MediaStore на Android?
Что такое UIImagePickerController?
Как делать скриншоты конкретных элементов?
Middle
element.getScreenshotAs(...) делает скриншот области конкретного элемента — поддерживается в большинстве драйверов.
Альтернатива — сделать скриншот всей страницы и обрезать по координатам элемента (element.getLocation() и getSize()).
Из практики: полезно для отчётности — показать конкретный баг визуально, не загромождая отчёт большими скриншотами всей страницы.
Частые ошибки
Делать слишком много скриншотов — раздувание артефактов.
Не обрабатывать ошибки получения скриншота.
Дополнительные вопросы
Чем screenshot элемента быстрее обрезки?
Когда нужен полный скриншот?
Что такое hybrid app и как переключать контекст?
Middle
Гибридное приложение — нативный контейнер с WebView внутри. Контексты: NATIVE_APP и WEBVIEW_*. driver.getContextHandles() — список доступных. driver.context('WEBVIEW_...') — переключение.
Внутри WebView работают обычные веб-локаторы. В нативной части — мобильные.
Из практики: типовые сценарии — нативные кнопки, потом форма в WebView, потом обратно нативная навигация. Важно вовремя переключать контекст.
Частые ошибки
Забыть переключиться и искать веб-элементы в нативном контексте.
Не настроить debuggable у Android-приложения и не увидеть WEBVIEW.
Дополнительные вопросы
Что нужно настроить в нативном приложении для WEBVIEW?
Чем react-native ближе — к нативному или гибридному?
Чем тестирование под одну и под обе платформы отличается?
Middle
Под одну платформу — меньше комбинаторики, можно глубже копать платформо-специфичные сценарии. Под обе — двойной объём, но похожая логика, отличия в UI/UX.
Стратегии: общие чек-листы + платформенные дополнения; общая команда vs специализация по платформам.
Из практики: для кросс-платформенных приложений (React Native, Flutter) часть тестов общая, но UI всегда разный. Полностью идентичных тестов почти не бывает.
Частые ошибки
Считать, что тесты Android можно один-в-один скопировать на iOS.
Не учитывать платформенные паттерны UX.
Дополнительные вопросы
Какие сценарии всегда отличаются между iOS и Android?
Что такое platform-specific test plan?
Как тестировать обновление приложения с миграцией БД?
Middle
Создать состояние на старой версии (зайти, добавить данные, накопить настройки), обновить на новую, проверить, что данные на месте и работают новые фичи.
Также тестируют downgrade (если такая ситуация возможна), миграцию через несколько версий (пользователь не обновлялся год).
Из практики: подготовленные снимки старых версий — основная инвестиция. Без них каждое тестирование миграций — кошмар.
Частые ошибки
Тестировать только установку с нуля.
Не тестировать миграцию через несколько версий.
Дополнительные вопросы
Как тестировать миграцию SQLite?
Что такое forced update?
Как протестировать функциональность совместного использования (sharing)?
Middle
Сценарии: поделиться текстом/ссылкой/изображением в разные приложения (Telegram, WhatsApp, Mail, копирование), приём share из других приложений.
Также проверяют ограничения: размер файла, типы контента, поведение при отсутствии целевого приложения.
Из практики: типовые баги — share не работает при отсутствии текста, странное форматирование в разных приёмниках, потеря метаданных.
Частые ошибки
Тестировать только в одно приложение.
Не проверять размер передаваемых данных.
Дополнительные вопросы
Что такое UIActivityViewController?
Как обработать sharing на Android?
Как протестировать widget или live activity?
Middle
Widget на iOS и Android — отдельный компонент на главном экране. Тестируют установку, отображение, обновление, deep link при клике, разные размеры.
Live Activity (iOS 16.1+) — обновляемое уведомление в Dynamic Island. Тестируют запуск, обновление через push, корректность UI.
Из практики: виджеты ограничены по обновлению (Android — 30 мин минимум, iOS — система решает). Тесты учитывают эти ограничения.
Частые ошибки
Полагать, что виджет обновляется мгновенно.
Не тестировать deep link при клике на виджет.
Дополнительные вопросы
Что такое WidgetKit на iOS?
Чем live activity отличается от обычного push?
Как тестировать сетевые ошибки на мобильном?
Middle
Сценарии: разрыв сети в середине запроса, медленная сеть, неверный ответ сервера (5xx, 4xx), таймаут, неверный формат JSON.
Инструменты: Charles Proxy / Burp для замены ответов, эмулятор Android для throttling, Apple Network Link Conditioner.
Из практики: типовые баги — приложение зависает на спиннере без таймаута, нет retry-логики, теряет данные при разрыве.
Частые ошибки
Тестировать только успешные ответы.
Не проверять retry-логику.
Дополнительные вопросы
Как настроить Charles для перехвата HTTPS?
Что такое exponential backoff?
Как протестировать background-задачи?
Middle
На Android есть WorkManager, JobScheduler, AlarmManager. На iOS — BackgroundTasks framework. Все они работают в условиях Doze, App Standby и системных ограничений.
Сценарии: запуск задачи в фоне, выполнение после ребута, поведение при низком заряде/энергосбережении, отзыв разрешений.
Из практики: фоновые задачи — частый источник багов, потому что их сложно воспроизвести. Используют логирование и проверки в админке.
Частые ошибки
Полагать, что задача выполнится «когда захочется» — ОС задерживает.
Не учитывать battery optimization у пользователя.
Дополнительные вопросы
Что такое WorkManager?
Чем background task на iOS отличается от Android?
Что такое A/B-тест на мобилке и как его проверять?
Middle
A/B-тест — показать разным группам пользователей разные варианты, измерить разницу в поведении/конверсии. Реализуется через feature flag сервисы (Firebase Remote Config, Optimizely).
QA проверяет: корректность распределения пользователей, отображение каждого варианта, отслеживание метрик, фолбэк при отказе сервиса.
Из практики: часто QA должен войти под разные user_id и подтвердить, что каждый получает свой вариант. Используются override-механизмы в debug-сборке.
Частые ошибки
Тестировать только один вариант, считая, что другой работает аналогично.
Не проверять fallback при отсутствии сети до remote config.
Дополнительные вопросы
Что такое Firebase Remote Config?
Как протестировать оба варианта быстро?
Как протестировать клавиатурные сокращения и accessibility на iPad?
Middle
iPad с клавиатурой поддерживает hardware shortcuts: Command+N для новой записи и т.п. Тестируют наличие, корректность, обнаружение через долгое нажатие Command.
Также проверяют VoiceOver (включается в Settings → Accessibility), Switch Control, Dynamic Type, Smart Invert.
Из практики: для серьёзных приложений iPad — полный аналог desktop. Без поддержки клавиатуры пользователи воспринимают приложение как «недоделанное».
Частые ошибки
Игнорировать iPad как «телефон побольше».
Не тестировать internal VoiceOver навигацию.
Дополнительные вопросы
Что такое UIKeyCommand?
Как протестировать Smart Invert?
Как тестировать app size и размер обновления?
Middle
Размер APK/IPA смотрят в Play Console / App Store Connect. Также инструменты: Android Studio APK Analyzer, Xcode size report — анализируют, что занимает место (ассеты, библиотеки, код).
Размер обновления через App Bundle / app thinning часто меньше, чем при первой установке.
Из практики: на iOS приложения крупнее ~200 МБ не качаются по сотовой сети без Wi-Fi (пользователь может разрешить вручную). На Android 150 МБ — это максимальный размер загрузки при доставке через App Bundle, а не лимит сотовой сети; крупные загрузки Google Play просто предупреждает.
Частые ошибки
Не следить за ростом размера от релиза к релизу.
Игнорировать ассеты, которые могут быть выгружены on-demand.
Дополнительные вопросы
Что такое App Bundle?
Что такое on-demand resources на iOS?
Что такое feature flags на мобилке и зачем они?
Middle
Feature flags позволяют включать/выключать функции без выпуска новой версии в магазин. Тестировщикам нужно проверять как состояние «ON», так и «OFF».
Особенно важно: что приложение корректно работает при отсутствии remote config (например, кеш или дефолтное значение).
Из практики: для мобильных flags имеют ещё одну особенность — после выпуска версия живёт долго (пользователи обновляются медленно), и flag должен поддерживаться месяцами.
Частые ошибки
Тестировать только «включённое» состояние.
Не проверять, что приложение не падает без сети при первой загрузке flag-config.
Дополнительные вопросы
Что такое kill switch?
Как затестировать обе ветки одного flag?
Как тестировать миграцию между разными моделями устройств?
Middle
Сценарии: восстановление аккаунта на новом устройстве (логин), перенос данных через iCloud/Google Backup, перенос покупок.
Проверяют: что доступ к контенту восстанавливается, локальные данные либо переносятся (если есть backup), либо корректно отсутствуют.
Из практики: типовые баги — потеря доступа к контенту, дублирование purchases, неправильное состояние после restore.
Частые ошибки
Тестировать только одну сторону переноса (старое или новое устройство).
Не проверять, как ведут себя in-app purchases.
Дополнительные вопросы
Что такое iCloud backup для приложения?
Чем Android Auto Backup отличается от iCloud?
Как тестировать приложение с ограничениями родительского контроля?
Middle
На iOS — Screen Time / Family Sharing с restrictions. На Android — Family Link. Эти системы могут блокировать установку, покупки, доступ к контенту.
Сценарии: попытка покупки с ребёнка → запрос родителю, ограничение контента по возрасту, блокировка приложения по расписанию.
Из практики: для приложений, ориентированных на детей или семьи, обязательная проверка. Также для apps с in-app purchases.
Частые ошибки
Игнорировать family sharing — поведение покупок может отличаться.
Тестировать только обычный аккаунт.
Дополнительные вопросы
Что такое 'Ask to Buy'?
Как протестировать age rating?
Как тестировать обработку ссылок из сторонних мессенджеров?
Middle
Сценарии: открыть ссылку в Telegram, WhatsApp, SMS, email. Каждый мессенджер по-своему обрабатывает ссылки (свой in-app browser, прямое открытие).
Также проверяют: parameters не теряются, universal link корректно открывает приложение, fallback на сайт работает.
Из практики: типовые баги — Telegram открывает ссылку в своём браузере вместо приложения, потеря utm-параметров, deep link в холодном старте не открывает нужный экран.
Частые ошибки
Тестировать только в одном мессенджере.
Не проверять переход в холодном старте.
Дополнительные вопросы
Как заставить ссылку открыться в приложении из Telegram?
Что такое intent filter на Android?
Что такое silent crash и как его поймать?
Middle
Silent crash — это краш или зависание (ANR), которое не показывается пользователю явно (или приложение «возвращается» само), но логируется в системе.
Признаки: пропали данные за период, метрики «session length» резко падают, негативные отзывы «зависает». Ищут в crashlytics, ANR reports, ratings.
Из практики: silent crashes часто более вредны, чем явные — пользователь не понимает, что произошло, и просто удаляет приложение.
Частые ошибки
Полагать, что отсутствие явных репортов = всё хорошо.
Не настраивать ANR-репорт в Firebase.
Дополнительные вопросы
Чем ANR отличается от crash?
Как настроить Firebase Crashlytics для ANR?
Какие специфичные баги бывают в SwiftUI / Jetpack Compose?
Middle
Декларативные UI-фреймворки имеют свои подводные камни: проблемы с re-композициями (производительность), state management, navigation, accessibility, фокус.
Часто баги связаны с порядком rerender, missed updates, утечками в @Composable / @ViewBuilder.
Из практики: тестировщик должен понимать, что compose/SwiftUI — относительно новые технологии, и баги в них возникают чаще, чем в классических UIKit/Android Views.
Частые ошибки
Считать, что декларативные фреймворки 'работают как магия'.
Не проверять перерисовки при изменении состояния.
Дополнительные вопросы
Что такое recomposition?
Чем Preview Compose помогает тестированию?
Что такое gesture conflict и как его искать?
Middle
Когда несколько жестов в одном экране срабатывают одновременно или мешают друг другу: вертикальный скролл vs горизонтальная карусель, swipe-back vs кнопка с swipe-action.
Тестируют: проверяют все возможные комбинации жестов на экране, особенно с границами и углами.
Из практики: типовые конфликты — карусель внутри скроллящейся страницы, swipe-to-delete возле края экрана с системным swipe-back.
Частые ошибки
Тестировать жесты только в центре экрана.
Игнорировать системные жесты как конфликт.
Дополнительные вопросы
Что такое systemGestureExclusionRects?
Как тестировать carousel внутри scroll?
Что такое cold start vs warm start vs hot start на Android?
Middle
Cold — процесс с нуля, инициализация Application, ContentProvider, основной Activity. Самый долгий.
Warm — процесс был, Activity пересоздаётся. Hot — Activity вернулся из фона без пересоздания.
Из практики: оптимизируют cold start больше всего — первое впечатление пользователя. Цель — 1-2 секунды на флагмане.
Частые ошибки
Тестировать только hot start.
Не учитывать ContentProvider в холодном старте.
Дополнительные вопросы
Что такое time-to-first-frame?
Чем App Startup Library помогает?
Как тестировать чтение из глобального clipboard?
Middle
iOS 14+ показывает индикатор, когда приложение читает clipboard. Это сделано для защиты приватности. Android 13+ — то же.
Тестируют: не читает ли приложение clipboard без необходимости, нет ли утечек, корректное поведение при отказе.
Из практики: чтение clipboard на старте — анти-паттерн (был у TikTok, скандал). Чтение должно быть по явному действию пользователя.
Частые ошибки
Читать clipboard на каждом appWillEnterForeground.
Не уважать privacy indicators.
Дополнительные вопросы
Что такое UIPasteboard?
Как протестировать privacy-indicator?
Что такое App Tracking Transparency (iOS)?
Middle
ATT (с iOS 14.5) требует у пользователя разрешения отслеживать его между приложениями через IDFA.
Тестируют: показывает ли приложение запрос, корректно ли обрабатывает отказ, не запрашивает ли тогда, когда не должно.
Из практики: после отказа пользователя приложение получает обнулённый IDFA. Маркетинговые SDK должны это учитывать.
Частые ошибки
Запрашивать ATT слишком рано — пользователь отказывается.
Не обрабатывать ATTrackingManagerAuthorizationStatusDenied.
Дополнительные вопросы
Что такое IDFA?
Как объяснить пользователю запрос ATT?
Как тестировать background location?
Middle
Геолокация в фоне — особый случай. На iOS требует Always permission, на Android — ACCESS_BACKGROUND_LOCATION (с 10).
Сценарии: разрешение When in Use vs Always, обновления в фоне, точность (precise vs approximate, iOS 14+).
Из практики: операционные системы агрессивно ограничивают background location ради батареи. Приложение должно корректно обрабатывать отказ или редкие обновления.
Частые ошибки
Полагать, что Always всегда работает в фоне как foreground.
Не учитывать battery optimization.
Дополнительные вопросы
Что такое geofencing?
Чем significant location change полезен?
Что такое pull-to-refresh и где он может ломаться?
Junior
Pull-to-refresh — жест: потянуть вниз, чтобы обновить. Стандартный на iOS и Android, у большинства списочных экранов.
Тестируют: индикатор показывается, контент обновляется, корректное поведение при медленной/нет сети, не конфликтует ли со scroll, работает ли на пустом списке.
Из практики: типовые баги — индикатор не пропадает, обновляется не то, что показывает экран, дублирование данных.
Частые ошибки
Не тестировать на пустом списке.
Не проверять поведение при ошибке сети.
Дополнительные вопросы
Что такое UIRefreshControl?
Чем infinite scroll отличается от pagination?
Что такое skeleton screen vs spinner?
Middle
Skeleton — placeholder в форме контента, показывающий примерную раскладку. Spinner — крутящийся индикатор без указания формы.
Skeleton ощущается как «уже что-то загружается», улучшает воспринимаемую производительность.
Из практики: для основных экранов — skeleton. Для коротких операций — spinner. Иногда комбинируют: skeleton + spinner внутри.
Частые ошибки
Использовать skeleton для каждой кнопки — overkill.
Делать сложные skeleton, дольше отрисовываемые, чем сама загрузка.
Дополнительные вопросы
Что такое perceived performance?
Чем shimmer animation полезен?
Что такое edge-to-edge UI на Android и почему это важно?
Middle
Edge-to-edge — приложение рисует под statusBar и navigationBar, давая иммерсивное ощущение. Системные элементы становятся полупрозрачными.
Требуется от Android 15 (target SDK 35). Без этого приложение может выглядеть «старомодным».
Из практики: при переходе на edge-to-edge нужно учитывать insets — чтобы кнопки не оказались под навигацией. Compose имеет API для этого.
Частые ошибки
Не учитывать system bar insets.
Делать полупрозрачные элементы там, где это мешает читаемости.
Дополнительные вопросы
Что такое WindowInsets?
Чем edge-to-edge отличается от fullscreen?
Что такое Apple App Store Review Guidelines?
Middle
Подробный документ с правилами публикации в App Store. Категории: безопасность, производительность, бизнес, дизайн, легальность. Часто меняется.
Типовые блокеры: in-app purchases только через Apple, неработающие функции в скриншотах, неподходящий контент, sensitive permissions без объяснения.
Из практики: перед сабмитом смотрят на актуальные правила. Отказ может задержать релиз на несколько дней.
Частые ошибки
Не читать guidelines и сабмитить наугад.
Игнорировать reject reasons — переподавать без правки.
Дополнительные вопросы
Что такое expedited review?
Чем Apple отличается от Google Play в плане ревью?
Что такое Web App Manifest и как тестировать PWA?
Middle
Manifest.json — описание PWA: имя, иконки, цвета, start_url, display mode (standalone, fullscreen). На основе этого браузер предлагает «Install» и показывает приложение как нативное.
Тестируют: установка работает, иконки показываются, splash screen корректный, оффлайн доступ через Service Worker.
Из практики: PWA — компромисс между web и нативом. На iOS поддержка ограничена, на Android полноценная.
Частые ошибки
Игнорировать iOS-ограничения PWA.
Не тестировать установку как нативного приложения.
Дополнительные вопросы
Что такое Trusted Web Activity?
Чем PWA отличается от Capacitor/React Native?
Что такое app shortcuts (Android) / Quick Actions (iOS)?
Middle
Контекстные действия из домашнего экрана при долгом нажатии на иконку приложения. На Android — App Shortcuts, на iOS — 3D Touch / Haptic Touch Quick Actions.
Тестируют: правильные действия в shortcut, корректный deep link на нужный экран, поведение, если приложение не запущено.
Из практики: shortcut'ы — отличный shortcut для частых действий (например, начать новый чат, открыть избранное).
Частые ошибки
Не настраивать deep link для shortcut.
Делать слишком много shortcut'ов — теряется фокус.