Проект по тестированию мобильных приложений: эмуляторы, логи, снифферы трафика
В проекте изучены особенности тестирования мобильных приложений под Android и iOS. Освоены работа с эмуляторами в Android Studio, снятие логов через Logcat, перехват и анализ трафика с помощью Charles Proxy. Рассмотрены типы мобильных приложений, мобильные ОС и их отличия, инструменты для дистрибуции тестовых сборок.
📱 Задание 1. Мобильные операционные системы
Изучены способы доставки тестовых сборок для iOS. Проанализированы 3 сервиса: TestFlight (Apple, бесплатно, но ограничения по количеству тестировщиков), Firebase App Distribution (Google, бесплатно до определённого лимита, интеграция с Firebase), Diawi (платный, просто для быстрых сборок).
Составлена сравнительная таблица по критериям: стоимость, простота настройки для разработчика, простота установки для тестировщика, ограничения. Дана рекомендация для стартапа с ограниченным бюджетом: Firebase App Distribution как оптимальный баланс функциональности и цены.
Составлен чек-лист внешних прерывателей для мобильного приложения (15 пунктов):
- Входящий звонок, SMS, уведомления от других приложений
- Низкий заряд батареи, режим энергосбережения
- Потеря сети, переключение Wi-Fi/4G/5G
- Поворот экрана, сворачивание приложения, открытие шторки
- Блокировка экрана, выключение/включение экрана
- Подключение/отключение зарядки, наушников, Bluetooth
- Смена языка системы, смена часового пояса
- Скриншот, запись экрана, вызов голосового ассистента
- Перегрузка памяти (открыто много приложений), вызов из другого приложения
Для 3 критичных прерываний финансового приложения написаны сценарии тестирования:
- Входящий звонок во время перевода денег — проверка сохранения состояния после возврата
- Потеря сети при подтверждении платежа — проверка отката транзакции и уведомления
- Низкий заряд батареи (1%) — проверка предупреждения и корректного завершения
Изучена тема утечки памяти в мобильных приложениях. Написано сообщение коллеге с объяснением проявлений: замедление работы, вылеты (OutOfMemoryError), повышенное потребление батареи, нагрев устройства.
📲 Задание 2. Типы мобильных приложений
Проанализированы 4 типа приложений для сервиса доставки еды с ограниченным бюджетом и сроком 4 месяца до прототипа.
| Тип | Суть | Плюсы | Минусы |
|---|---|---|---|
| Нативное | Отдельно для iOS и Android на родных языках | Макс. производительность, полный доступ к API устройства | Дорого, долго, два параллельных процесса |
| Гибридное | WebView + оболочка, один код | Быстрая разработка, один код для двух платформ | Низкая производительность, ограниченный доступ к API |
| Веб-приложение | Адаптивный сайт, не требует установки | Макс. скорость запуска, не нужен магазин приложений | Нет push-уведомлений, ограниченный доступ к геолокации |
| Кроссплатформенное | Flutter/React Native, один код в нативный | Близко к нативу по производительности, один код | Сложная отладка, зависимость от фреймворка |
Выбран тип: кроссплатформенное приложение (React Native или Flutter).
Аргументы:
- Один код под обе платформы — укладываемся в бюджет и срок 4 месяца
- Доступ к нативным API (геолокация, push, камера, платежи) есть через плагины
- Производительность достаточна для MVP-прототипа, близка к нативной
Риски для качества:
- Проблемы с производительностью при интенсивной работе с геолокацией
- Ошибки на одной из платформ из-за особенностей плагинов
- Сложность отладки мостов между общим кодом и нативными модулями
Рекомендации по фокусу тестирования: тщательная проверка push-уведомлений на обеих платформах, тестирование геолокации в разных условиях (город, тоннель, отсутствие GPS), нагрузочное тестирование платёжного шлюза.
🖥️ Задание 3. Работа с Android Studio
Установлена Android Studio. Создан эмулятор с поддержью Play Market (Pixel 4, API 33). Приложен скриншот запущенного эмулятора.
Изучен процесс включения режима разработчика на Android: 7 нажатий на Build number в Настройках → О телефоне. Сделан скриншот раздела Для разработчиков.
Изучена функция Logcat в Android Studio:
- Фильтрация по уровню (Verbose, Debug, Info, Warn, Error, Assert)
- Фильтрация по тегу (поиск конкретного компонента приложения)
- Фильтрация по PID (идентификатор процесса)
- Поиск по ключевым словам
Написан тестовый лог-запись через приложение или эмулятор, сделан скриншот.
Изучены гайды по созданию симулятора в Xcode. Составлена пошаговая инструкция для коллеги:
- Установить Xcode из App Store (только на macOS)
- Открыть Xcode → Preferences → Platforms
- Выбрать нужную версию iOS и скачать симулятор
- В меню Window → Devices and Simulators
- Нажать + → выбрать тип устройства и версию ОС
- Запустить симулятор через Xcode → Open Developer Tool → Simulator
Важные моменты: Xcode работает только на macOS, для скачивания симулятора нужно минимум 5-10 ГБ свободного места, старые версии iOS могут быть недоступны для скачивания.
📝 Задание 4. Логи и логирование
Сценарий: приложение онлайн-банка аварийно завершается при просмотре истории операций.
Определены уровни логов, важные для анализа:
- ERROR — фатальные ошибки, приводящие к крашу
- WARN — предупреждения перед ошибкой (некорректные данные, таймауты)
- DEBUG — детали запросов к серверу и ответов
Обоснование: ERROR покажет место краша, WARN поможет найти предшествующие аномалии, DEBUG — параметры запроса истории.
Механизм получения логов:
- Android: Logcat через Android Studio или adb logcat
- iOS: Console.app на macOS или устройства Xcode
Базовые шаги:
- Подключить устройство к компьютеру
- Открыть Android Studio → View → Tool Windows → Logcat
- Выбрать устройство и пакет приложения
- Воспроизвести краш
Фильтры для Logcat:
- По тегу:
package:com.bank.app - По уровню:
level:ERROR - По ключевым словам:
"history"или"transaction" - Комбинация:
package:com.bank.app level:ERROR "history"
Драфт баг-репорта:
Заголовок: Приложение онлайн-банка аварийно завершается при попытке просмотреть историю операций за последний месяц
Критичность: Critical Серьёзность: High
Шаги воспроизведения:
- Открыть приложение онлайн-банка
- Авторизоваться
- Перейти в раздел История операций
- Выбрать период Последний месяц
- Нажать Показать
Ожидаемый результат: Отображается список операций за последний месяц
Фактический результат: Приложение аварийно завершается, возврат на домашний экран
🔍 Задание 5. Charles Proxy
Установлен Charles Proxy. Настроены сертификаты: SSL-сертификат на ПК (Help → SSL Proxying → Install Charles Root Certificate), на мобильном устройстве (настройки прокси на IP и порт 8888, установка сертификата через chls.pro/ssl).
Изучены функции Charles Proxy и их применение в тестировании:
| Функция | Назначение | Практическая задача тестировщика |
|---|---|---|
| Фильтрация запросов | Отображение только нужных запросов | Отфильтровать запросы конкретного домена при анализе |
| Работа с логами | Сохранение, экспорт, очистка сессий | Сохранить сессию с багом для разработчика |
| Зашифрованный трафик | Расшифровка HTTPS через установку сертификата | Проверка содержимого защищённых запросов/ответов |
| Map remote | Перенаправление запросов на другой сервер | Тестирование на тестовом бэкенде без смены конфигурации |
| Breakpoint | Остановка запроса/ответа для редактирования | Изменение данных "на лету" для проверки обработки |
| Rewrite | Автоматическое изменение заголовков/URL/тел | Подмена цены, статуса, заголовков без ручного вмешательства |
| Throttling | Симуляция скорости и качества сети | Проверка работы приложения при плохом соединении |
Практическая реализация на интернет-магазине (выбран demo.opencart.com):
Breakpoints — перехват и редактирование запроса Создан скринкаст. Настроен Breakpoint на запрос добавления товара в корзину. В перехваченном запросе изменено название товара на "Тестовый товар". После отправки изменения в корзине отображается новое название.
Map Local — подмена картинки товара Создан скринкаст. Подготовлена локальная картинка. Настроен Map Local: URL запроса картинки → путь к локальному файлу. При загрузке страницы товара вместо оригинальной картинки отображается локальная.
Rewrite — подмена цены Создан скринкаст. Настроено правило Rewrite: Response Body — замена старой цены на новую (999 руб → 1 руб). После обновления страницы цена изменилась.
Throttle — симуляция медленной сети Включен Throttle: 3G (300 kbps, задержка 150 ms). Поведение сайта до и после:
- До: картинки и контент загружались быстро (<1 сек)
- После: загрузка картинок заметно замедлилась (5-10 сек), сначала отображались плейсхолдеры, прерывать загрузку можно нажатием "Stop"
| Тема | Что освоено |
|---|---|
| Мобильные ОС | Android vs iOS, способы доставки тестовых сборок |
| Типы приложений | Нативные, гибридные, веб, кроссплатформенные — выбор под бюджет и сроки |
| Эмуляторы/симуляторы | Различия, создание эмулятора в Android Studio, Xcode симуляторы |
| Логи | Logcat, уровни (ERROR/WARN/DEBUG), фильтрация, анализ крашей |
| Снифферы трафика | Charles Proxy: установка сертификатов, фильтрация, breakpoints, rewrite, throttle, map local/remote |
| Файл | Содержание |
|---|---|
| src/task_1.md | Сравнение сервисов iOS, чек-лист прерываний, сценарии тестирования, утечка памяти |
| src/task_2.md | Анализ типов приложений, выбор и обоснование для доставки еды |
| src/task_3.md | Скриншоты Android Studio, эмулятора, Logcat, инструкция по Xcode |
| src/task_4.md | Баг-репорт с логами, анализ уровней и фильтров |
| src/task_5.md | Скринкасты Breakpoints, Map Local, Rewrite, анализ Throttle |