Зачем QA прокси-инструменты

HTTP-прокси инструменты располагаются между клиентом и сервером, давая полную видимость и контроль над сетевым трафиком. Для QA-инженеров они незаменимы: отладка мобильных приложений (где нельзя увидеть сетевые запросы напрямую), тестирование граничных случаев (модификацией ответов сервера) и симуляция сетевых условий (throttling, задержка).

В отличие от DevTools браузера, которые показывают трафик только из браузера, прокси-инструменты захватывают трафик из любого приложения — мобильных, десктопных, CLI и фоновых сервисов.

Типичные QA-сценарии

  • Отладка мобильных приложений: Просмотр каждого API-вызова
  • Тестирование обработки ошибок: Модификация ответов для возврата ошибок, пустых данных или невалидного JSON
  • Симуляция медленных сетей: Throttling полосы пропускания для тестирования в условиях 3G/4G
  • Проверка API-контрактов: Инспекция точных payload запросов/ответов
  • Тестирование без изменений бэкенда: Замена ответов сервера локальными файлами

Charles Proxy и Fiddler

Charles Proxy

Charles — самый популярный GUI-прокси для QA-инженеров:

Настройка:

  1. Установить Charles Proxy
  2. Настроить браузер/устройство на использование Charles как HTTP-прокси (localhost:8888)
  3. Для HTTPS: Установить корневой сертификат Charles и включить SSL proxying

Основные функции:

ФункцияНазначениеQA-сценарий
SSL ProxyingРасшифровка HTTPS-трафикаИнспекция деталей запросов/ответов
BreakpointsПауза запроса/ответаМодификация данных перед доставкой
Map LocalЗамена ответа локальным файломТестирование с mock-данными
Map RemoteПеренаправление на другой серверМаршрутизация продакшен-URL на staging
RewriteМодификация заголовков/тела правиламиДобавление/удаление заголовков
ThrottleСимуляция сетевых условийТестирование на медленной сети

mitmproxy для автоматизации

mitmproxy — командный прокси-инструмент, скриптуемый на Python:

# Установка
pip install mitmproxy

# Интерактивный консольный режим
mitmproxy

# Веб-интерфейс
mitmweb

# Режим дампа (неинтерактивный, для скриптов)
mitmdump

Скрипт-аддон на Python

# modify_response.py — Внедрение ошибок для тестирования
from mitmproxy import http

def response(flow: http.HTTPFlow):
    if "/api/v1/checkout" in flow.request.pretty_url:
        flow.response.status_code = 500
        flow.response.text = '{"error": "Internal Server Error"}'
# Запуск со скриптом
mitmdump -s modify_response.py
graph LR C[Клиентское приложение] -->|Запрос| P[Прокси
Charles/Fiddler/mitmproxy] P -->|Инспекция и модификация| S[Сервер] S -->|Ответ| P P -->|Инспекция и модификация| C

Продвинутые техники прокси

Настройка прокси для мобильных приложений

iOS:

  1. Подключитесь к тому же WiFi, что и машина с прокси
  2. Настройки > WiFi > HTTP-прокси > Вручную: укажите IP и порт прокси
  3. Откройте chls.pro/ssl для установки корневого сертификата Charles
  4. Настройки > Основные > Об устройстве > Доверие сертификатам > Включить корневой Charles

Android:

  1. Для Android 7+ приложения по умолчанию игнорируют пользовательские сертификаты
  2. Добавьте network security config для разрешения сертификатов прокси:
<network-security-config>
  <debug-overrides>
    <trust-anchors>
      <certificates src="user" />
    </trust-anchors>
  </debug-overrides>
</network-security-config>

Инспекция WebSocket и gRPC

  • Charles Proxy может инспектировать WebSocket-фреймы
  • mitmproxy поддерживает инспекцию WebSocket с выделенными event hooks
  • gRPC-трафик (HTTP/2 + protobuf) требует proto-файлов для читаемой инспекции

Автоматическая запись ответов для mock-серверов

# Записать все ответы в файл
mitmdump -w recorded_session.flow

# Воспроизвести записанные ответы (работает как mock-сервер)
mitmdump --server-replay recorded_session.flow

Это создаёт мгновенные mock-серверы из реального трафика — незаменимо для офлайн-тестирования и CI-окружений.

Практическое упражнение

Настройте Charles Proxy и выполните задачи:

  1. Настроить SSL proxying для api.example.com
  2. Захватить трафик из мобильного приложения или браузера
  3. Использовать breakpoints для модификации API-ответа (изменить status code на 500)
  4. Использовать Map Local для возврата mock-данных из локального JSON
  5. Настроить throttling для симуляции условий 3G
Подход к решению
  1. Proxy > SSL Proxying Settings > Добавить api.example.com:443
  2. Настроить прокси устройства на ваш-ip:8888, установить сертификат Charles
  3. Proxy > Breakpoints > Добавить api.example.com/endpoint > Редактировать ответ
  4. Tools > Map Local > Маппинг URL-паттерна на локальный .json
  5. Proxy > Throttle Settings > Включить, выбрать пресет «3G»

Советы профессионала

  • Всегда отключайте настройки прокси после тестирования — оставшиеся конфигурации вызывают загадочные сбои
  • Используйте Map Local для тестирования фронтенда с mock-ответами API без бэкенда
  • Записывайте прокси-сессии для баг-репортов — они захватывают точные данные
  • Для мобильного тестирования используйте Android network security config
  • Скрипты mitmproxy можно интегрировать в CI для автоматизированных тестов

Ключевые выводы

  1. Прокси-инструменты обеспечивают непревзойдённую видимость клиент-серверной коммуникации
  2. Модификация запросов/ответов позволяет тестировать граничные случаи, невозможные через UI
  3. Скриптуемость mitmproxy связывает ручное исследование с CI-автоматизацией
  4. Тестирование мобильных приложений почти всегда требует настройки прокси