В разработке и QA часто приходится сталкиваться с тестированием мобильных приложений. Как правило, задача не самая очевидная и сложнее, чем тестирование веб-интерфейсов, где можно просто вызвать консоль разработчика и посмотреть, какие данные приходят и уходят. Дело в том, что мобильное приложение по сути представляет собой «чёрный ящик»: непонятно, что происходит «под капотом», куда обращается приложение, какие данные передаёт и что получает.
Иногда бывает, что в процессе разработки не предусмотрели способ тестирования самого приложения, а локализовать проблему необходимо. В таком случае подключают мобильного разработчика, который смотрит, какие данные приходят и уходят, и в целом локализует проблему. Разумеется, это отнимает время, тогда как специалисты QA могли бы сделать это самостоятельно.
Давайте попробуем решить этот кейс и разобраться, какими данными обменивается приложение, чтобы QA-специалисты могли локализовать проблему на стороне бэкенда или устройства.
Как правило, существует несколько способов решения этой задачи, например:
- Добавление логгера, который выводит все уходящие и приходящие запросы.
Минусы:
- Нужно прятать логгер под какими-то флагами.
-Решать, выводить его в продакшн-версии приложения или нет (например, для воспроизведения проблем на проде). - Проксирование запросов в приложении и перенаправление трафика через прокси.
Добавляется скрытая настройка, позволяющая указывать, через какой прокси отправлять данные.
Минусы:
-Нужно решать, передавать ли данные в открытом виде через HTTP или настраивать сквозное проксирование через промежуточный HTTP-хост, который уже перенаправляет трафик на нужный адрес.
Оба способа подходят для Android и iOS, но для этого необходимо, чтобы мобильное приложение поддерживало соответствующий функционал.
Тестирование Android приложений с Charles Proxy и Android эмулятором
В этом решении мы просто устанавливаем приложение на эмулятор и работаем с ним как с обычным приложением.
Что потребуется для работы:
Рабочие директории (для Windows):
C:\Users\Default\Android\Sdk\emulator\emulator.exe
C:\Users\Default\Android\Sdk\platform-tools\adb.exe
Оптимально добавить их в переменную окружения Path для удобства. Далее примеры будут приведены с учётом этой настройки, но можно запускать файлы и напрямую из их директорий.
Примечание: пример рассмотрен для Windows, но на Unix-системах механизм будет аналогичным.
Шаги настройки:
1. Создаём Android-эмулятор в Android Studio.
Если ранее не использовали, скачиваем образы.
Важно: выбираем версию без Google Play! Иначе не получится запустить эмулятор с root-доступом.
Например: Android 12.0 (Google APIs).
Максимальная версия, на которой у меня запускалось — Android API 31. Рекомендую использовать её.
На самых свежих версиях, насколько я знаю, есть проблемы с таким запуском.
2. Открываем cmd от имени администратора.
3. Получаем список доступных эмуляторов:
emulator -list-avds
Должен появиться созданный вами эмулятор, например: Pixel_2_API_34
4. Запускаем эмулятор с правами записи в систему:
emulator -avd Pixel_2_API_34 -writable-system
При первом запуске нового образа нужно подождать, пока он развернётся.
В результате должен запуститься эмулятор с мобильным устройством.
5. Открываем второй терминал cmd от имени администратора и получаем root-права:
adb root
6. Перемонтируем диск на эмуляторе:
adb remount
Потребуется перезагрузка:
adb reboot
После перезагрузки снова выполняем:
adb root
adb remount
7. Настраиваем Charles Proxy:
Запускаем Charles. Сохраняем сертификат.
8. Переименовываем сертификат в его хеш.
Для получения хеша понадобится openssl (можно выполнить в Git Bash или на сервере):
openssl x509 -inform PEM -subject_hash_old -in charles.pem | head -1
Пример вывода:
6031e357
Переименовываем файл сертификата в полученный хеш с добавлением ".0".
В примере это будет "6031e357.0". Важно: у вас хеш может отличаться.
9. Копируем сертификат в эмулятор:
adb push 6031e357.0 /system/etc/security/cacerts/6031e357.0
10. Выставляем права:
adb shell chmod 644 /system/etc/security/cacerts/6031e357.0
11. Перезагружаем эмулятор:
adb reboot
12. Проверяем настройки Charles Proxy:
Убеждаемся, что Charles слушает порт 8888.
Включена галочка SSL Proxy Settings → Enable SSL Proxying.
Можно отключить Windows Proxy, чтобы Charles не перехватывал трафик основной системы.
13. Пробрасываем порты с основной машины в эмулятор:
adb reverse tcp:8888 tcp:8888
Проверяем, что порты добавлены:
adb reverse --list
14. Настраиваем Wi-Fi на эмуляторе:
Отключаем мобильную сеть.
В настройках Wi-Fi указываем прокси-сервер: 127.0.0.1:8888.
15. Запускаем приложение (например, Tenchat) и проверяем запросы в Charles.
Получили полную информацию отправляемую нашим тестируемым приложением.
Оптимизация производительности эмулятора
Если эмулятор работает медленно, можно:
1. Увеличить объём оперативной памяти:
Открываем файл:
C:\Users\<username>\.android\avd\<emulator_name>.avd\config.ini
Меняем параметр:
hw.ramSize = 4000
2. Отключить тяжелые функции:
hw.audioInput=no
hw.audioOutput=no
hw.GPS=no
Обязательно подписывайтесь на канал! И буду очень признателен, если напишите, интересен ли вам контент такого технического плана!
----
🚀 Читайте мои посты раньше всех — подписывайтесь на мой Телеграм канал! 🚀