Битва снифферов: Charles vs Proxyman
Привет, меня зовут Даша, я работаю тестировщицей клиентского мобильного приложения в Ozon.
Сегодня поговорим о снифферах в тестировании мобильных приложений –– программах для перехвата, анализа и модификации трафика. Пожалуй, самый популярный сниффер, о котором я слышала, — Charles. Про него уже не раз писали на Хабре, есть довольно детальные разборы. Но не Charles-ом единым!
Например, у нас в Ozon команда разработчиков в основном пользуется Proxyman, а тестировщики (в том числе и я) — Charles.
Не так давно у нас в команде разработки мобильного приложения случился холивар на тему “Charles vs Proxyman”. Я попыталась выяснить, почему некоторые люди пользуются Proxyman, а другие — Charles. Из разговоров с коллегами мне было не до конца понятно, какой из снифферов лучше (и чем именно). Поэтому я решила попользоваться Proxyman и разобраться самостоятельно. Давайте вместе посмотрим, какой из инструментов — Charles или Proxyman — выйдет победителем в битве снифферов.
Готовим поле для битвы снифферов: ключевое о тулинге
Снифферы позволяют видеть, что приходит с бэка, изменять или перезаписывать этот ответ; то же самое можно сделать с запросами на бэк. Это даёт нам отличные возможности для тестирования клиент-сервисного взаимодействия (особенно если основная логика зашита на сервере).
Например, сегодня с бэка приходит заголовок страницы, состоящий из одного слова, и всё выглядит красиво и соответствует макетам. Но завтра бэк решает написать в заголовке пару предложений вместо одного (условно) — и то, как это будет выглядеть, как раз и помогает узнать сниффер.
В своей работе я чаще всего использую следующие функции: Rewrite, Map Local, Breakpoints и Throttling.
Rewrite:
для замены URL — чтобы перенаправить трафик с тестовой среды на продакшен или наоборот (например, если фича готова только для тестовой среды);
для подмены статус-кода, который приходит с бэка, — чтобы посмотреть, корректно ли будет вести себя приложение при ошибке сервера;
для добавления или изменения заголовка в запросе — если фичу необходимо протестировать с определёнными хедерами.
Map Local — для полной замены ответа страницы с бэка на локальный файл.
Этой фичей удобно пользоваться для тестирования различных состояний элементов: открываешь файл, на который был заменён ответ страницы, меняешь в нём значение, сохраняешь и обновляешь страницу на устройстве. Как шутят наши разработчики, если у тебя достаточно сохранённых ответов с разных страниц, то из них можно построить приложение.
Breakpoints — с помощью этой функции можно поставить точку останова на любой URL; когда устройство будет его запрашивать, запрос к серверу откроется в формате редактирования.
Запрос можно будет изменить или прервать; то же самое произойдёт с ответом от сервера. По сути, Breakpoints может заменить Rewrite и Map Local, но всё же эта фича больше подходит для единоразового использования. Постоянно выискивать ту самую строчку, которую необходимо изменить, довольно затратно по времени, да и запрос за это время может отвалиться по тайм-ауту.
Throttling — отличная фича для подмены скорости интернета. Можно увидеть, как поведёт себя приложение на медленной скорости, как при этом будут загружаться картинки, видео или карта.
Давайте сравнивать Charles и Proxyman на примере этих функций.
Начинаем битву снифферов: установка и настройка
Для начала давайте разберёмся, как установить наши снифферы.
Charles: можно бесплатно скачать с официального сайта.
После инсталляции приложения устанавливаем сертификат на железо: Help -> SSL Proxying -> Install Root Certificate. Сниффер готов к работе.
Proxyman: скачиваем бесплатно с официального сайта.
Устанавливаем сертификат: Certificate -> Install Certificate on this Mac ->
Install and trust. Сниффер готов к работе.
Сравнение основных фич Charles и Proxyman
Начнём с простого.
Установка сертификата и подключение мобильного устройства к снифферу
Charles:
Убедиться, что телефон и ноутбук подключены к одной сети.
На мобильном устройстве: Настройки Wi-Fi -> Настройка прокси -> Вручную -> Сервер: ввести IP из Charles (Help -> Local IP Address) -> Порт: по умолчанию вводится 8888.
Открыть браузер и перейти по ссылке chls.pro/ssl.
Для Android: после загрузки сертификата необходимо его открыть и задать имя; после этого устройство будет готово к работе со сниффером.
Для iOS: Настройки -> Основные -> Профили: установить только что скачанный сертификат.
Для iOS: Настройки -> Основные -> Об этом устройстве -> Доверие сертификатам: включить для сертификата из п. 3.
Всё, вы великолепны! Можете запускать приложение и работать с трафиком.
Proxyman: процесс подключения реального устройства такой же, как в случае с Charles. Отличаются только место, где можно узнать IP, и адрес для скачивания сертификата.
Чтобы узнать IP, переходим в Certificate -> Install Certificate on iOS (Android) -> Physical Devices. Здесь можно найти IP-адрес, который необходимо вводить в настройках, а также адрес, по которому можно скачать сертификат и подробную инструкцию по его установке.
В этом раунде победителем для меня стал Proxyman. В нём есть подробное описание процесса установки сертификата на мобильное устройство. В случае с iOS многие забывают о том, что необходимо включить опцию «Доверие сертификатам», а подробная инструкция Proxyman позволяет избежать этой ошибки.
Подключение симулятора к снифферу
Подключение симулятора происходит немного по-другому по сравнению с подключением реального устройства. Я пишу тут именно про симулятор, потому что подключение эмулятора ничем не отличается от подключения реального устройства.
Charles:
Сделать ресет симулятора: Device -> Erase All Contents and Settings.
Help -> SSL Proxying -> Install Charles Root Certificate in iOS Simulators.
Сделать рестарт симулятора: Device -> Restart.
Убедиться, что вы слушаете трафик вашего компьютера: Proxy -> MacOS Proxy (должна стоять соответствующая галочка).
Proxyman:
1. Открыть Certificate -> Install Certificate on iOS -> Simulators.
2. Поставить последовательно галочки в каждом пункте.
Готово, вы великолепны!
В этом раунде тоже выигрывает Proxyman — это видно даже по количеству пунктов в списке. Несколько кликов — и всё готово, в отличие от замороченной настройки Charles.
Функции снифферов: Rewrite
Charles:
Tools -> Rewrite -> поставить чекбокс Enable Rewrite.
Нажать на Add для создания правила для Rewrite.
В окне Location с помощью кнопки Add можно добавить один или несколько URL, для которых будет работать это правило.
В окне под Location с помощью кнопки Add можно задать правило, по которому будет работать Rewrite.
Есть большой выбор типов Rewrite, которые можно задать в выпадающем меню Type. Например, можно добавить, изменить или удалить Header в Request, изменить Response Code или подменить URL запросов.
Например, вот так будет выглядеть правило для добавления Header в Request:
Proxyman:
Scripting -> Script List (⌥⌘I).
Нажать + в левом нижнем углу и задать правила, по которым будет работать скриптинг.
В поле Name внести название шаблона.
Указать URL, для которого будут работать эти правила.
Всё, после этого можно выбирать и заменять значения Request и Response.
Вот так будет выглядеть скрипт для добавления параметров Header и Query в Request:
В этом раунде для меня однозначно выигрывает Charles. Возможно, потому что я не фанат замороченных настроек и писать срипт для подмены хедера для меня слишком сложно по сравнению с нажатием нескольких кнопок.
Функции снифферов: Map Local
Следующая по порядку, но не менее важная функция — Map Local. С её помощью можно полностью подменить ResponseBody.
Charles:
Запустить приложение, чтобы трафик пошёл через Charles.
Щёлкнуть правой кнопкой по URL, ответ от которого необходимо изменить, и выбрать Map Local.
В окне Edit Mapping нажать на кнопку Choose и выбрать файл, содержимое которого должно отображаться в ответе.
Proxyman:
Tools -> Map Local.
Нажать + в левом нижнем углу и заполнить поля Name (название правила) и URL (адрес, для которого будет выполняться правило).
Нажать Select Local File и выбрать JSON-файл, которым будет подменяться ответ (запрос).
В этом раунде для меня нет победителя, но фича, с помощью которой в Proxyman можно открывать файл сразу в текстовом редакторе, мне очень понравилась.
Функции снифферов: Breakpoints
Функция Breakpoints предназначена для изменения и прерывания запросов и ответов непосредственно в сниффере.
Charles:
Нажать на кнопку Enable Breakpoints на верхней панели.
Щёлкнуть правой кнопкой по URL, для которого необходимо использовать Breakpoints, и нажать на Breakpoints.
Также можно задать правила Breakpoints в пункте меню Proxy -> Breakpoints Settings.
После перехода по указанному URL сработает Breakpoints — и запрос с ответом станут редактируемыми; по нажатию на кнопку Abort их можно будет прервать.
Proxyman:
Щёлкнуть правой кнопкой по URL, для которого необходимо использовать Breakpoints, и нажать на Breakpoints.
В открывшемся окне можно задать правила, по которым будет работать Breakpoints.
При желании можно изменить URL, а также использовать Breakpoints для чего-то одного: только для запроса или только для ответа.
В этом раунде силы снифферов равны.
Функции снифферов: Throttling
Последняя функция из основного незаменимого арсенала снифферов — Throttling.
Charles:
Proxy -> Throttle Settings.
Выбрать опцию Enable Throttling. Если поставить чекбокс Only for selected hosts, кнопка Add станет активной и по нажатию на неё можно будет добавить те URL, для которых сработает изменение скорости интернета.
Скорость интернета, которую будет симулировать Charles, можно выбрать из выпадающего списка или задать в соответствующих полях:
Proxyman:
Tools -> Network Conditions.
Выбрать опцию Enable Network Conditions.
По нажатию на + откроется окно, в котором можно настроить правила симуляции скорости интернета.
В этом раунде соперники равны.
Charles vs Proxyman: выбираем победителя
Мы рассмотрели только четыре функции снифферов — из списка незаменимых. Понятно, что в целом функций гораздо больше (надеюсь когда-нибудь собраться с силами и написать более подробный гайд по Proxyman).
Как видно из итогов раундов, у каждого сниффера есть свои плюсы и минусы. Мне нравится Charles за удобный интерфейс и более понятную настройку правил (нажал две кнопочки — и готово!), а Proxyman — за более гибкую настройку правил и подключения симуляторов (наверное, именно этим объясняется любовь разработчиков).
В этот раз явного победителя в битве снифферов нет; какой использовать, каждому предстоит решать самостоятельно. Рассказывайте в комментариях, что выбираете вы!