mobile-qatools

Proxyman for QA: guide to inspecting and rewriting HTTP traffic

HTTP/HTTPS traffic between an app and a server is the single biggest source of mobile bugs that are hard to reproduce: analytics, IAP, ads, remote config, A/B tests, push notifications. If you only test โ€œvia the UIโ€, you see half of the picture. Proxyman is a macOS app that intercepts, displays and lets you modify this traffic in real time. Itโ€™s a must-have for mobile QA.

What is Proxyman

A local HTTP proxy with a GUI. You run it on your Mac, it captures traffic from the Mac itself and from any device connected to the same Wi-Fi (iOS, Android, simulators). It sees the contents of every request, including HTTPS โ€” once you install the CA certificate.

Effectively an analogue of Charles Proxy and mitmproxy, but with a modern UI and a focus on native mobile development. proxyman.io.

Why mobile QA needs it

  • See what the app actually sends to the server: analytics events, IAP receipts, ad impressions, remote config requests.
  • Rewrite server responses (Map Local) โ€” test the UI against configs that donโ€™t yet exist in production.
  • Throttle the network โ€” check how the game behaves on 3G/2G/packet loss.
  • Set a breakpoint on a request โ€” change status code 200 โ†’ 500 on the fly to test error handling.
  • Export a request as curl โ€” paste into a bug report so a developer can reproduce in one command.
  • Diff between builds โ€” what changed in API calls between 1.5 and 1.6.

Installation

On the Mac

  • Download from proxyman.io/download (the free tier covers 90% of QA needs; Pro is a one-time $69).
  • On first run it asks to install a self-signed CA certificate โ€” accept and set it to Always Trust in Keychain.
  • Menu Certificate โ†’ Install Certificate on this Mac โ†’ enter password.

Connect an iOS device

  • In Proxyman: Tools โ†’ iOS Device โ†’ Setup โ€” youโ€™ll see the IP and port (usually 9090).
  • On the iPhone: Settings โ†’ Wi-Fi โ†’ info icon for the current network โ†’ Configure Proxy โ†’ Manual โ†’ enter IP and port.
  • Open Safari on the phone, go to http://proxy.man/ssl โ€” a profile downloads.
  • Settings โ†’ General โ†’ VPN & Device Management โ†’ install the profile.
  • Important: Settings โ†’ General โ†’ About โ†’ Certificate Trust Settings โ†’ enable the toggle for the Proxyman CA. Without this, HTTPS wonโ€™t decrypt.

Connect an Android device

  • Same proxy in Wi-Fi settings.
  • Download the certificate from http://proxy.man/ssl.
  • Settings โ†’ Security โ†’ Install certificate โ†’ CA certificate.
  • For Android 7+, regular user-installed certificates donโ€™t work for an app unless the app is a debug build. You need network_security_config.xml in the manifest with trust-anchors for user CAs. If your app doesnโ€™t have that โ€” ask the devs to add it to the debug variant.
  • For emulator: launch with emulator -http-proxy http://<mac-ip>:9090.

Key features

SSL Proxying โ€” HTTPS decryption

By default Proxyman shows HTTPS requests with a โ€œgreen lockโ€ โ€” encrypted. To see the contents โ€” right-click the domain โ†’ Enable SSL Proxying. Doing this for all domains is a bad idea (system services will flood your log). Enable it selectively: your API, analytics, ads.

Map Local โ€” rewrite response with a local JSON

The most useful feature for QA. Workflow:

  • Capture the request (e.g. GET /api/levels-config).
  • Right-click โ†’ Tools โ†’ Map Local.
  • Point to a local JSON file that Proxyman will return instead of the server response.

Use case: the devs havenโ€™t deployed the new config format yet, but you want to verify that the UI renders it correctly. Write the JSON, map it, test โ€” without dependency on the backend.

Map Remote โ€” redirect to another URL

Rewrites the request URL. Use case: your dev build hits production API by default, but you need staging. No rebuild โ€” just add a rule.

Breakpoint โ€” pause mid-request

The request โ€œhangsโ€ before being sent (Request Breakpoint) or before the response is received (Response Breakpoint). A window opens where you edit headers, body, status code, then click Execute. Use case: verify the app correctly handles 401 / 500 / timeout / empty response โ€” without involving the backend team.

Network Conditioner โ€” simulate poor connectivity

Tools โ†’ Network Conditions โ†’ choose a profile: 3G, Edge, 5% packet loss, high latency. Use case: verify the game doesnโ€™t freeze when the connection drops mid-level-load and shows a proper retry popup instead.

Composer โ€” send custom requests

A Postman-like tool inside Proxyman. Use case: take a real request from the session โ†’ duplicate โ†’ change one parameter โ†’ send โ†’ see the response. Test API edge cases without needing the app.

Compare Flows โ€” diff requests

Pick two request/response pairs โ†’ Compare. Get a line-by-line diff. Use case: what changed between builds 1.5 and 1.6 in analytics events. What the devs accidentally added or removed.

Scripting โ€” run JavaScript on every request

A Pro feature. Write a JS script applied to request or response: modify headers automatically, measure latency, log specific fields. Use case: an automated test that โ€œno analytics is sent before user consent is grantedโ€.

QA workflow: reproducible bug in 5 minutes

Typical scenario with a mobile game:

  • Connect iPhone to Proxyman, enable SSL proxying for the analytics and IAP domains.
  • Reproduce the bug โ€” e.g., after buying a booster, the HUD counter doesnโ€™t update.
  • In Proxyman find the request POST /v1/iap/verify โ€” response is 200 OK, but JSON contains "granted": false.
  • Right-click โ†’ Copy as cURL โ€” paste into the bug report.
  • Optional: Save Session โ€” export a .prxsession file and attach to the ticket. The developer opens it locally and walks through it step by step.

Without Proxyman this bug becomes a multi-hour dance with logs and stacktraces. With Proxyman โ€” diagnosis in 5 minutes.

Tips & tricks

  • Allow list of domains. Filter out everything unrelated to your app (macOS system updates, iCloud, AppStore, Spotlight). View โ†’ Filter Bar โ†’ type the domain. Instantly readable.
  • Save sessions for every reproduced bug. The file is light, lives locally, can be opened months later.
  • The certificate expires after a year. If one day HTTPS stops decrypting โ€” regenerate the CA in Proxyman: Certificate โ†’ Generate New CA โ†’ reinstall on devices.
  • Custom Note on a flow. Mark weird requests with text like โ€œbug about double-chargeโ€ โ€” easier to search later.
  • Multiple tabs (Pro). Keep one tab for the main app, another for a specific flow like onboarding.

When Proxyman doesnโ€™t fit

  • Non-HTTP traffic (TCP, UDP, WebSocket-binary, raw gRPC) โ€” Wireshark is better.
  • Cross-platform team (Windows/Linux): Proxyman is Mac-only. Alternatives are Charles Proxy (also Mac-only), mitmproxy (CLI, cross-platform), Fiddler (Windows).
  • Production devices where you canโ€™t install a CA certificate โ€” no proxy can decrypt HTTPS, physics says so. Debug builds or freshly-built TestFlight versions only.

Alternatives and comparison

  • Charles Proxy โ€” old standard, exists since 2002. More cluttered UI, slightly less convenient for mobile development. $50.
  • mitmproxy โ€” open-source, CLI + web UI, cross-platform. Powerful for Python scripting, but a higher learning curve.
  • Fiddler โ€” Windows-oriented, Telerik. Fiddler Everywhere exists for Mac, but is less mature.
  • Wireshark โ€” low-level network analyzer. Doesnโ€™t handle HTTPS out of the box. For anything that isnโ€™t HTTP โ€” itโ€™s the tool.

For casual mobile QA on Mac โ€” Proxyman is optimal. For aggressive automation in CI โ€” mitmproxy.

Where to start

  • Install Proxyman on your work Mac.
  • Connect a test iPhone, catch the first HTTPS request from your app.
  • Make one Map Local change โ€” for example, substitute a feature flag in remote config response โ†’ see how the UI behaves.
  • Enable Network Conditioner with a 3G profile for 5 minutes โ€” youโ€™ll discover a pile of small UX issues.

Documentation: docs.proxyman.io โ€” official docs. proxyman.io โ€” main site, downloads, licenses.