不止于抓包用mitmproxy 安卓模拟器搭建你的第一个自动化测试沙盒在移动应用开发与测试领域流量拦截工具早已超越了简单的抓包分析阶段。当我们需要验证API接口的健壮性、模拟异常响应或自动化执行特定测试用例时传统工具往往显得力不从心。这就是为什么越来越多的测试工程师开始将mitmproxy与安卓模拟器结合构建可编程的自动化测试沙盒环境。这种技术组合特别适合以下场景需要批量修改请求参数验证服务端容错机制针对特定接口动态注入测试数据实现自动化流量回放与比对测试快速构建异常场景测试环境1. 环境准备与基础配置1.1 选择适合的安卓模拟器夜神模拟器因其良好的兼容性和可定制性成为首选但需要注意几个关键配置点# 检查模拟器网络模式 adb shell ifconfig建议配置参数配置项推荐值说明Android版本7.1.2兼容性最佳分辨率1080x1920 (竖屏)适配主流移动设备网络模式桥接模式确保与主机同网段Root权限开启方便证书安装1.2 mitmproxy的核心安装与验证不同于简单的pip安装生产环境建议使用虚拟环境# 创建并激活虚拟环境 python -m venv mitm_env source mitm_env/bin/activate # Linux/Mac mitm_env\Scripts\activate # Windows # 安装指定版本 pip install mitmproxy8.1.0验证安装成功后可以运行基础命令测试mitmdump --version mitmweb # 启动web界面2. 证书配置的深度实践2.1 模拟器端的证书安装技巧常规的证书安装流程往往忽略几个关键细节在设置 → 安全中启用未知来源安装使用adb推送证书到系统目录更可靠adb push mitm-proxy-ca-cert.pem /system/etc/security/cacerts/ adb shell chmod 644 /system/etc/security/cacerts/mitm-proxy-ca-cert.pem对于Android 7需要额外配置网络安全性!-- res/xml/network_security_config.xml -- network-security-config base-config trust-anchors certificates srcraw/mitmproxy/ /trust-anchors /base-config /network-security-config2.2 解决常见证书信任问题当遇到证书不受信任警告时可以检查确保证书已安装到系统证书库而非用户证书库日期和时间设置是否正确是否使用了过期的mitmproxy证书默认有效期1年提示定期更新mitmproxy证书可避免过期问题使用mitmproxy --cert-update命令生成新证书3. 编写自动化测试脚本3.1 基础请求拦截与修改创建一个基础的拦截脚本modify_requests.pyfrom mitmproxy import http def request(flow: http.HTTPFlow) - None: if flow.request.pretty_url.endswith(/api/login): flow.request.headers[X-Test-Injected] true flow.request.query[debug] 1 def response(flow: http.HTTPFlow) - None: if /api/user/profile in flow.request.url: flow.response.content b{name: TestUser, status: mock}启动时使用mitmdump -s modify_requests.py --set block_globalfalse3.2 高级过滤规则实践组合使用过滤参数可以大幅提升效率# 只处理POST请求且URL包含/v2/的API mitmdump -s script.py ~m post ~u /v2/ # 忽略图片等大体积资源 mitmdump --set stream_large_bodies1mb常用过滤表达式表达式说明示例~m匹配HTTP方法~m get~u匹配URL~u /api/~d匹配域名~d example.com~b匹配请求体~b testdata4. 构建完整的测试沙盒4.1 自动化测试流程设计典型的测试沙盒工作流程启动模拟器并自动设置代理import subprocess subprocess.run([nox_adb, shell, settings put global http_proxy 192.168.1.100:8080])运行mitmproxy加载测试脚本执行自动化测试用例收集并分析流量数据4.2 实战案例电商应用测试沙盒假设我们需要测试电商应用的支付流程class PaymentTest: def response(self, flow): if /payment/confirm in flow.request.url: # 修改支付结果响应 original json.loads(flow.response.content) original[status] failed original[reason] balance_insufficient flow.response.content json.dumps(original).encode() # 记录测试用例 with open(test_log.txt, a) as f: f.write(fMocked payment failure at {time.ctime()}\n)配套的测试断言脚本def check_payment_flow(): with open(test_log.txt) as f: logs f.read() assert Mocked payment failure in logs print(Payment test case verified)5. 性能优化与高级技巧5.1 内存与性能调优长期运行的测试沙盒需要注意# 限制内存使用 mitmdump --set connection_strategylazy # 禁用不必要的功能 mitmdump --no-http2 --no-websocket推荐性能参数参数推荐值说明--set stream_large_bodies2mb大文件不加载到内存--set keep_host_headerfalse优化代理性能--set proxy_debugfalse生产环境关闭调试信息5.2 多设备并行测试方案使用mitmproxy的reverse模式支持多设备# reverse_proxy.py from mitmproxy import proxy, options from mitmproxy.tools.dump import DumpMaster opts options.Options( modereverse:http://backend:8080, listen_port9000 ) pconf proxy.config.ProxyConfig(opts) m DumpMaster(opts) m.server proxy.server.ProxyServer(pconf) m.run()启动多个实例分别监听不同端口为每个模拟器分配独立代理端口。