不止于抓包:用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 mitmproxy==8.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 src="@raw/mitmproxy"/> </trust-anchors> </base-config> </network-security-config>
2.2 解决常见证书信任问题
当遇到"证书不受信任"警告时,可以检查:
- 确保证书已安装到系统证书库而非用户证书库
- 日期和时间设置是否正确
- 是否使用了过期的mitmproxy证书(默认有效期1年)
提示:定期更新mitmproxy证书可避免过期问题,使用
mitmproxy --cert-update命令生成新证书
3. 编写自动化测试脚本
3.1 基础请求拦截与修改
创建一个基础的拦截脚本modify_requests.py:
from 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_global=false3.2 高级过滤规则实践
组合使用过滤参数可以大幅提升效率:
# 只处理POST请求且URL包含/v2/的API mitmdump -s script.py "~m post & ~u /v2/" # 忽略图片等大体积资源 mitmdump --set stream_large_bodies=1mb常用过滤表达式:
| 表达式 | 说明 | 示例 |
|---|---|---|
| ~m | 匹配HTTP方法 | ~m get |
| ~u | 匹配URL | ~u /api/ |
| ~d | 匹配域名 | ~d example.com |
| ~b | 匹配请求体 | ~b "testdata" |
4. 构建完整的测试沙盒
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(f"Mocked 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_strategy=lazy # 禁用不必要的功能 mitmdump --no-http2 --no-websocket推荐性能参数:
| 参数 | 推荐值 | 说明 |
|---|---|---|
| --set stream_large_bodies | 2mb | 大文件不加载到内存 |
| --set keep_host_header | false | 优化代理性能 |
| --set proxy_debug | false | 生产环境关闭调试信息 |
5.2 多设备并行测试方案
使用mitmproxy的reverse模式支持多设备:
# reverse_proxy.py from mitmproxy import proxy, options from mitmproxy.tools.dump import DumpMaster opts = options.Options( mode="reverse:http://backend:8080", listen_port=9000 ) pconf = proxy.config.ProxyConfig(opts) m = DumpMaster(opts) m.server = proxy.server.ProxyServer(pconf) m.run()启动多个实例分别监听不同端口,为每个模拟器分配独立代理端口。