news 2026/4/19 22:33:18

不止于抓包:用mitmproxy + 安卓模拟器搭建你的第一个自动化测试沙盒

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
不止于抓包:用mitmproxy + 安卓模拟器搭建你的第一个自动化测试沙盒

不止于抓包:用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 模拟器端的证书安装技巧

常规的证书安装流程往往忽略几个关键细节:

  1. 设置 → 安全中启用"未知来源安装"

  2. 使用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
  3. 对于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=false

3.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 自动化测试流程设计

典型的测试沙盒工作流程:

  1. 启动模拟器并自动设置代理

    import subprocess subprocess.run(["nox_adb", "shell", "settings put global http_proxy 192.168.1.100:8080"])
  2. 运行mitmproxy加载测试脚本

  3. 执行自动化测试用例

  4. 收集并分析流量数据

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_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( mode="reverse:http://backend:8080", listen_port=9000 ) pconf = proxy.config.ProxyConfig(opts) m = DumpMaster(opts) m.server = proxy.server.ProxyServer(pconf) m.run()

启动多个实例分别监听不同端口,为每个模拟器分配独立代理端口。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/19 22:25:39

5步掌握Android视频压缩神器:释放手机空间的终极方案

5步掌握Android视频压缩神器&#xff1a;释放手机空间的终极方案 【免费下载链接】VideoCompressor A High-performance video compressor for Android using Hardware decoding and encoding API(MediaCodec). 项目地址: https://gitcode.com/gh_mirrors/vi/VideoCompressor…

作者头像 李华
网站建设 2026/4/19 22:24:40

STM32F103驱动MCP2515避坑指南:为什么你的CAN总线初始化总失败?

STM32F103驱动MCP2515避坑指南&#xff1a;为什么你的CAN总线初始化总失败&#xff1f; 深夜的实验室里&#xff0c;王工盯着示波器上杂乱的SPI波形&#xff0c;第17次按下复位键。这个曾经稳定工作的MCP2515驱动代码&#xff0c;在更换新批次芯片后突然变得不可靠——这正是嵌…

作者头像 李华
网站建设 2026/4/19 22:21:52

面试官最爱问的8个Java基础题,别再死记硬背了!

面试官最爱问的8个Java基础题解析与实战应对策略 Java作为企业级开发的主流语言&#xff0c;其基础知识的掌握程度往往成为面试筛选的第一道门槛。但很多候选人在准备面试时容易陷入两个极端&#xff1a;要么死记硬背标准答案&#xff0c;要么过度关注框架而忽视语言本质。本文…

作者头像 李华
网站建设 2026/4/19 22:21:27

2026年AI工具怎么选?别只看参数,先想清楚这3个问题

先说结论工具选择的核心不是找“最强”&#xff0c;而是找“最适配”。编程优先选Cursor或DeepSeek&#xff0c;中文内容创作无脑豆包&#xff0c;企业办公看腾讯元宝&#xff0c;多语言或创意写作再考虑ChatGPT。免费版和付费版的差距&#xff0c;往往不在基础能力&#xff0c…

作者头像 李华
网站建设 2026/4/19 22:16:57

手把手教你用Python模拟一个简易的1553B总线控制器(附代码)

用Python构建1553B总线仿真器&#xff1a;从协议解析到多终端交互实战 在航空电子和军事装备领域&#xff0c;1553B总线堪称数字神经系统的"黄金标准"。这种诞生于上世纪70年代的总线协议&#xff0c;至今仍在F-35战斗机和阿波罗飞船等尖端装备中发挥着关键作用。但对…

作者头像 李华