Charles: незаменимый тул в арсенале QA-инженера

16932eda4133487fa76d40eea72765ff.png
Для тестирования мобильных приложений, работающих с удаленными серверами, QA-инженеру приходится держать под рукой множество разных тестовых аккаунтов, логов, запросов и ответов. Реальность такова, что не всегда удается договориться о предоставлении нужных тестовых данных в срок. Чаще всего серверные разработчики будут незнакомыми вам людьми по ту сторону Скайпа. В таких ситуациях приходится своими руками подменять ответ сервера перед его передачей в приложение.

Чтобы редактировать выдачу сервера и воспроизводить сложные тестовые сценарии в QA Redmadrobot, мы используем Charles.

Как это работает?


Charles — инструмент для мониторинга HTTP/HTTPS трафика. Программа работает как прокси-сервер между мобильным приложением (в нашем случае) и сервером этого приложения. Charles записывает и сохраняет все запросы, которые проходят через подключенный к нему телефон и позволяет их редактировать.

Инструкция по установке Charles на Mac OS X и подключение телефона.
1. Качаем и устанавливаем.
2. При первом запуске Charles заботливо предложит автоматически настроить параметры сети — соглашаемся.
3. Переходим в Proxy > Proxy Settings и выставляем порт 8888, если он уже не прописан.
4. На телефоне заходим в настройки Wi-Fi и прописываем в прокси сервер IP-адрес вашего Mac и порт 8888.
Телефон должен быть подключен к той же Wi-Fi сети, что и ваш Mac.

bae4db707768420ba4c25eb08b8384b6.png

Готово. При следующем соединении клиент Charles попросить разрешение подключить ваш телефон. После этого в Charles начинают отображаться все HTTP-запросы и ответы, которые проходят через ваш телефон.

Для мониторинга HTTPS-трафика нужно пройти дополнительные шаги:
5. Переходим в браузер телефона и заходим на www.charlesproxy.com/getssl для установки сертификата SSL, который будет использоваться при подключении. Устанавливаем.
6. В списке хостов выбираем желаемый хост с HTTPS и ставим галочку Enable SSL Proxying.
66729fae9a50475fb1bb4d41d874a6fb.png

Готово. Теперь в клиенте Charles отображается HTTPS-трафик по выбранному хосту.

Важно
Если ваше приложение использует SSL pinning, то Charles не сможет перехватывать запросы и ответы.


Мониторинг трафика


Для наглядной демонстрации работы с API используем приложение Хабрахабр для Android. На iPhone стоит защита от программ типа Charles, но на Android её нет.

0af09ea713a943f78c043c35aff6619a.PNG

Charles выстраивает все запросы в порядке их отправки на сервер. Запросы и ответы можно просматривать как в отформатированном, так и в «сыром» виде. В QA Redmadrobot во время тестирования телефон всегда подключен к Charles. Таким образом остается возможность посмотреть историю запросов и отследить хитрые баги.

dd917d3dc4614b41906441588721e930.png

Подмена данных


Как видите, у меня не так много кармы. Charles поможет сделать вид, что её чуть больше, чем есть на самом деле.

d27c7ff2935b40c9af42d0264898e545.png

Выдача по аккаунту выглядит так (только JSON-строка, без header’ов):

{
        "data": {
                "id": 946584,
                "login": "yaryabu",
                "time_registered": "2015-02-27T15:22:52+03:00",
                "score": 6,
                "fullname": null,
                "sex": 0,
                "rating": 0,
                "rating_position": 0,
                "geo": {
                        "country": null,
                        "region": null,
                        "city": null
                },
                "counters": {
                        "posts": 1,
                        "comments": 3,
                        "followed": 0,
                        "followers": 0
                },
                "badges": [{
                        "alias": "habred",
                        "title": "Захабренный",
                        "plural": "Захабренные",
                        "description": "Пользователь с кармой \u003E0."
                }],
                "avatar": "http:\/\/habrahabr.ru\/i\/avatars\/stub-user-middle.gif",
                "is_readonly": false
        },
        "server_time": "2015-10-16T20:38:02+03:00"
}

В логе есть поле score:

"score": 6

По всей видимости, как раз то, что мне нужно.

Rewrite settings

Для подмены серверных данных открываем Tools > Rewrite.
В списке слева отображаются сеты из запросов, которые можно составлять на свой вкус. После создания сета идет выставление location. Здесь мы прописываем URL запроса с query параметрами (по желанию).

Следующий шаг — создать правило подмены. К сожалению, Charles не умеет подменять информацию по ключу. Нужно вручную прописывать ключ и значение, а затем писать то, что мы ходим увидеть.

Окно создания правила будет выглядеть следующим образом:

9f6495cca535449dbe092eef8d285ff4.png

Сам экран подмены будет выглядеть приблизительно так:

44ef9b0b490f429fb5236a0fcd30cf19.png

Следующий ответ по запросу информации о себе будет иметь отредактированные данные, score = 5000:

{
        "data": {
                "id": 946584,
                "login": "yaryabu",
                "time_registered": "2015-02-27T15:22:52+03:00",
                "score": 5000,
                "fullname": null,
                "sex": 0,
                "rating": 0,
                "rating_position": 0,
                "geo": {
                        "country": null,
                        "region": null,
                        "city": null
                },
                "counters": {
                        "posts": 1,
                        "comments": 3,
                        "followed": 0,
                        "followers": 0
                },
                "badges": [{
                        "alias": "habred",
                        "title": "Захабренный",
                        "plural": "Захабренные",
                        "description": "Пользователь с кармой \u003E0."
                }],
                "avatar": "http:\/\/habrahabr.ru\/i\/avatars\/stub-user-middle.gif",
                "is_readonly": false
        },
        "server_time": "2015-10-16T20:58:05+03:00"
}

При следующем переходе на экран профиля в приложении Хабра мы увидим плод своих трудов.
a9a120eb470843e2bdbdf319c68d0aa8.png

Хочу еще раз напомнить, что информация на сервере остается прежней. Данные изменяются во время путешествия к МП и эти изменения никак не затрагивают реальные данные профиля.

Таким же образом можно подменять не только ответы, но и запросы. Для этого на экране Rewrite rule нужно поставить галочку в поле Request, а не Response.

Breakpoints

При подмене запросов с помощью Rewrite settings в Charles невозможно редактировать кириллицу. При изменении любой информации на кириллицу ваши логи будут состоять из множества вопросительных знаков.

К счастью, этот недостаток можно обойти с помощью другой функции Charles — breakpoints. Идея похожая, но только ответы останавливаются прямо перед передачей в МП, и их можно редактировать своими руками в реальном времени.

Открываем Breakpoints settings и прописываем URL запроса.
944d5fe38c6e4cf6a4065d3ca438f648.png

При следующем ответе по этому запросу Charles перехватит всю выдачу и позволит нам с ней работать. Следует держать в голове, что МП может выкинуть ошибку по тайм-ауту, и текущий запрос уйдет в никуда.
af8a90b0f85b4e59bfc5ee6afc53d54c.png

Заменим мой логин на что-нибудь, написанное на кириллице.
7ae9d5c84d1a45c3853696a2affeae59.png

Вот и все. Приложение отображает нужную нам информацию и проблем с кириллицей не возникает.
18cc365262784f2aa8ddbb962f1ae704.png

Самое главное


Лицензионная версия Charles обойдется в $50 на человека. Charles разрешает пользоваться собой бесплатно, но с ограничениями. Функционал инструмента не блокируется, но во время использования триальной версии иногда будут появляться окна с просьбой подождать 5-10 секунд перед возобновлением работы и еще раз подумать о том, как клево было бы купить лицензию. Также каждые 30 минут программа будет автоматически завершаться и вся история запросов будет утрачена.

Итоги


Charles является незаменимым инструментом в арсенале QA-инженеров Redmadrobot. С его помощью можно создавать любые необходимые тестовые данные, как реальные, так и невозможные (если верить API-спецификациям). Такие возможности расширяют границы тестирования черного ящика и позволяют наблюдать все основные взаимодействия вашего МП и его серверов. Тестирование на таком уровне позволяет находить более сложные дефекты и значительно повышает общее качество приложения.

© Habrahabr.ru