Нефункциональное тестирование на мобиле
Отчёт говорит: 99,5% сессий без падений. Звучит отлично. Считаем на пользователя. Сессия - это один заход в приложение: открыл, поработал, свернул. Если человек заходит сорок раз в месяц, вероятность встретить падение хотя бы раз - 18%. За квартал при ста двадцати сессиях - уже 45%. То есть «почти нет падений» означает, что каждый пятый человек за месяц упирается в краш.
Стержень: скорость и стабильность меряют по устройствам аудитории и в долях пользователей, а не средним на телефоне разработчика.
// Формулировки: «почему нельзя мерить скорость на флагмане?», «что такое зависание интерфейса?», «где хранить токены?».
Стабильность: как читать проценты
Доля сессий без падения - главная метрика стабильности, но её нельзя читать как школьную оценку. Сессий у человека много, и вероятности перемножаются: пока прогон один, 99,5% выглядят прекрасно, а на сорока сессиях в месяц это 18% людей, столкнувшихся с падением. Разница между 99,5% и 99,9% на бумаге - четыре десятых процента, а на деле 18% пострадавших против 4%.
Рядом стоит зависание интерфейса. Система Android считает приложение зависшим, если главный поток - тот, что рисует интерфейс и обрабатывает нажатия, - занят дольше пяти секунд, и показывает человеку окно «приложение не отвечает». Но пять секунд - это формальный порог системы: человек считает интерфейс сломанным гораздо раньше, уже когда экран секунду не реагирует на нажатие.
// Поэтому зависания не отмахиваются словами «это же не падение». Для человека замерший экран хуже честного падения: при падении понятно, что случилось, а тут он не знает, живо приложение или нет, и жмёт по кнопке ещё пять раз - иногда оформляя пять заказов.
- доля сессий без падения
- перемножается по сессиям: 99,5% - это 18% пострадавших за месяц
- зависание интерфейса
- главный поток занят; система Android рисует «не отвечает» после 5 секунд
Скорость: замер на слабом процессоре
Я взял один и тот же экран и прогнал его с искусственно замедленным процессором - так моделируют разницу между флагманом и бюджетным телефоном. Отрисовка списка из трёх тысяч строк: на полной скорости 49 миллисекунд, при замедлении вчетверо - 142, вшестеро - 246, вдесятеро - 288. Пересчёт двухсот тысяч записей на экране: 63 миллисекунды на полной скорости и 760 при замедлении вдесятеро, то есть в двенадцать раз дольше.
Вот почему нельзя мерить скорость на телефоне разработчика. На мощном железе тяжёлая логика прячется: 63 миллисекунды никто не заметит. На слабом та же логика - три четверти секунды заметного подвисания на каждое действие, и это уже те самые отзывы «тормозит».
// Меряют то же, что и на сервере, но по устройствам: время холодного старта, отклик на нажатие, плавность прокрутки. И обязательно перцентилями - то есть смотрят не среднее, а худшие проценты: p95 отклика показывает, как живут самые невезучие, а среднее их прячет.
- замедленный процессор
- приём моделирования бюджетного телефона на машине разработчика
- перцентиль отклика
- смотрим худшие проценты, а не среднее: среднее прячет медленных
Трафик, батарея, размер, секреты
Трафик считается легко и удивляет всех. Экран каталога: двадцать фотографий по 350 килобайт, шрифты 180, скрипты 420, ответы сервера 90 - итого 7690 килобайт, около 7,5 мегабайта за один заход. Триста заходов в месяц - 2,2 гигабайта только на просмотр каталога. Если те же фотографии отдавать сжатыми и под размер экрана, по 60 килобайт, выходит 1890 килобайт за заход и 0,54 гигабайта в месяц - в четыре раза меньше. Для человека на лимитном тарифе это его деньги.
Батарею и память на глаз не оценить, для них есть профилировщики - инструменты платформы, показывающие, на что именно уходят заряд и память. Проверяют расход в активной работе и особенно в фоне: фоновое определение местоположения или постоянное соединение способны съесть заряд за полдня, и в отзывах это выглядит как «жрёт батарею», без уточнения, что именно.
// Секреты - токены доступа, пароли, ключи - хранят в системном защищённом хранилище (Keychain у Apple, Keystore у Android), а не в обычных настройках приложения открытым текстом - оттуда их достанут на устройстве с полным доступом. Отдельная проверка - что именно уходит наружу: трафик приложения перехватывают и смотрят, не отправляются ли ПДн (персональные данные) в аналитику открытым текстом. Проверять это чтением кода бессмысленно, надо смотреть на реальные запросы.
- вес экрана
- сумма всего загруженного за заход; на тарифе это деньги пользователя
- системное хранилище секретов
- защищённое место для токенов вместо обычных настроек приложения
Как отвечать: «Почему нельзя мерить скорость только на флагмане?»
Потому что мощное железо прячет ровно те проблемы, которые ищешь. Я мерил один и тот же экран с искусственно замедленным процессором: отрисовка списка на полной скорости заняла 49 миллисекунд, а при замедлении вдесятеро - 288; пересчёт двухсот тысяч записей 63 миллисекунды против 760, то есть в двенадцать раз дольше. На телефоне разработчика эти 63 миллисекунды не заметит никто, а на бюджетном устройстве три четверти секунды подвисания на каждое действие - это уже отзывы «тормозит». Аудитория, особенно на Android, сидит на телефонах трёх-четырёхлетней давности с двумя-тремя гигабайтами памяти, там и память заканчивается быстрее, и приложение чаще выгружается из фона. Поэтому скорость я меряю по матрице реальных устройств и обязательно перцентилями, а не средним: среднее прячет самых невезучих, а именно они пишут отзывы. Ту же логику применяю к стабильности - доля сессий без падений перемножается, и 99,5% на сорока сессиях в месяц означают, что каждый пятый человек встретил краш. И к батарее с трафиком: их тоже проверяют на устройствах и тарифах аудитории, а не в идеальных условиях офиса.
Почему это сильный ответ: тезис подкреплён измерением с двумя разными нагрузками, объяснено, почему разница не видна на флагмане, и вывод распространён на стабильность, батарею и трафик с расчётом по пользователям.
На чём валят
- −Мерить скорость на флагмане: та же логика на слабом процессоре шла в 12 раз дольше.
- −Читать 99,5% сессий без падений как отличный результат - это 18% пострадавших за месяц.
- −Отмахиваться от зависаний «это же не падение» - замерший экран для человека хуже краша.
- −Не считать вес экрана: 7,5 мегабайта за заход превращаются в 2,2 гигабайта в месяц.
- −Хранить токены в обычных настройках приложения открытым текстом вместо системного хранилища.
Проверьте себя
Пять вопросов из банка по этой подтеме. Всего их 12, остальные разбираются в тренажёре.
- Почему размер устанавливаемого приложения — тоже характеристика качества?A)Более крупное приложение содержит больше кэша, поэтому работает заметно быстрееB)Размер установочного пакета определяет версию Android или iOSC)Большой размер снижает конверсию установки и требует места на устройствеD)Размер приложения не влияет ни на что важное для пользователя
показать ответ и разбор
+C)Большой размер снижает конверсию установки и требует места на устройстве// разбор: Крупный установочный пакет отпугивает: часть пользователей не ставит приложение на мобильном трафике или при нехватке памяти, конверсия установки падает, а стор может требовать Wi-Fi для скачивания больших пакетов. Плюс место на устройстве и время загрузки. Поэтому размер контролируют (App Bundle/сплиты, сжатие ресурсов, удаление неиспользуемого). Тестировщик отслеживает рост размера между версиями. Быстродействие с размером напрямую не связано.
- Как проверяют поведение приложения на слабой и нестабильной сети (2G, потери пакетов)?A)Только на быстром домашнем Wi-Fi — если там работает, значит работает вездеB)Полностью отключают сеть и проверяют лишь чистый офлайн-режимC)Считают, что оператор обеспечивает стабильную скорость в моментD)Дросселируют сеть: задержки, низкая скорость, потери — и смотрят таймауты, ретраи, UX
показать ответ и разбор
+D)Дросселируют сеть: задержки, низкая скорость, потери — и смотрят таймауты, ретраи, UX// разбор: Реальные пользователи часто в метро, за городом, на переполненной соте — медленно, с задержками и потерями. Такую сеть эмулируют дросселированием (инструменты ОС/прокси, network conditioner, режимы фермы): высокий пинг, низкая полоса, обрывы. Проверяют разумные таймауты (не вечная крутилка), корректные ретраи без дублей, индикацию загрузки, частичную подгрузку, устойчивость к обрыву посреди запроса. «Работает на быстром Wi-Fi» ничего не говорит о слабой сети.
- Какие показатели производительности важны именно на мобильном клиенте?A)Время холодного старта, плавность прокрутки (без фризов), отзывчивость на тапB)Только скорость ответа сервера: клиент лишь рисует данные и на скорость не влияетC)Общее число строк исходного кода в приложенииD)Скорость интернет-соединения на рабочем месте разработчика
показать ответ и разбор
+A)Время холодного старта, плавность прокрутки (без фризов), отзывчивость на тап// разбор: На клиенте пользователь чувствует: холодный/тёплый старт (сколько ждать до интерактива), плавность списков и анимаций (дроп кадров, фризы главного потока, jank), отзывчивость на нажатие, задержку до первого контента. Это упирается в работу UI-потока, тяжёлые операции, память и GC, а не только в сервер. Тестировщик замеряет на реальных (и слабых) устройствах профайлерами, ловит фризы прокрутки длинных списков и долгий старт. Серверная латентность — отдельная, дополняющая метрика.
- Что проверяют в безопасности хранения данных на самом устройстве?A)Что данные держат в открытом виде ради скорости: шифрование замедляет работу приложенияB)Что токены и чувствительные данные лежат в защищённом хранилище (Keychain/Keystore)C)Что данные хранятся только на сервере и на устройстве их нет вообщеD)Что файл приложения открыто виден всем другим приложениям на устройстве
показать ответ и разбор
+B)Что токены и чувствительные данные лежат в защищённом хранилище (Keychain/Keystore)// разбор: На устройстве оседают токены сессии, кэш, персональные данные. Их нельзя держать в открытом виде (обычные SharedPreferences/файлы, логи): при доступе к устройству, бэкапе или на рутованном/джейлбрейкнутом телефоне они утекут. Секреты кладут в защищённое хранилище платформы — iOS Keychain, Android Keystore/EncryptedSharedPreferences — а чувствительное не логируют и не показывают в превью. Тестировщик проверяет, где и как лежат данные, очистку токена при выходе и поведение на скомпрометированном устройстве.
- Приложение тормозит только после 15 минут игры/видео. Вероятная нефункциональная причина?A)Это баг сети: за пятнадцать минут работы у устройства разорвалось соединениеB)Приложение обязано работать сколь угодно долго вообще без всякой деградацииC)Тепловой троттлинг: устройство греется и снижает частоты, падает FPSD)Причина только в версии ОС, а само железо устройства тут ни при чём
показать ответ и разбор
+C)Тепловой троттлинг: устройство греется и снижает частоты, падает FPS// разбор: Под длительной тяжёлой нагрузкой (игры, видео, камера, вычисления) устройство греется, и ОС снижает частоты CPU/GPU, чтобы не перегреться — это тепловой троттлинг. Производительность падает через несколько минут даже при идеальном коде, сильнее в компактных корпусах. Тестировщик воспроизводит на реальном устройстве длительной сессией, следит за температурой и FPS, проверяет плавную деградацию (снизить качество графики) вместо фризов и крашей. На эмуляторе это не увидеть — нужен настоящий термопрофиль железа.
дальше
Теорию прочитали. Навык ставится повторением
В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, лимит только на количество вопросов в день.