Charles实战:从零搭建移动端Https抓包与Mock测试环境
1. 为什么需要Charles抓包与Mock测试作为一个在移动端测试领域摸爬滚打多年的老手我见过太多因为网络请求问题导致的灵异事件。比如上周就有个同事跑来问我为什么我的App在测试环境总是莫名其妙报错但用Postman调用接口又完全正常 这种情况十有八九是因为客户端和服务端的数据交互出了问题而Charles就是解开这类谜团的瑞士军刀。Charles本质上是一个跨平台的网络抓包工具但它比Fiddler这类工具更适合移动端开发测试场景。我总结过它的三大核心价值实时监控像X光机一样透视所有HTTP/HTTPS请求和响应数据篡改不用改代码就能模拟各种异常数据场景环境模拟轻松构建弱网、超时等特殊测试条件特别是在敏捷开发中当后端接口还没ready时前端就可以用Charles的Mock功能提前联调。去年我们团队做电商大促压力测试就是靠Charles模拟了200多种异常订单状态提前发现了支付流程的3个关键漏洞。2. 环境搭建与基础配置2.1 安装与激活Charles的安装过程简单到令人发指但有几个细节需要注意官网下载时建议选择稳定版而非最新版我踩过beta版内存泄漏的坑Mac用户可能会遇到安全提示需要在「系统偏好设置-安全性与隐私」中手动放行首次启动时会提示注册可以先用30天试用期输入任意邮箱即可这里有个小技巧如果你在Windows上使用建议关闭杀毒软件的实时监控否则可能会出现证书安装失败的情况。我之前用某数字卫士就中过招折腾半天才发现是它在作怪。2.2 网络代理设置要让手机流量经过Charles需要完成以下步骤# 查看本机IPMac ifconfig | grep inet | grep -v 127.0.0.1 # Windows用户可以用 ipconfig找到IP后在手机WiFi设置里配置手动代理确保手机和电脑在同一局域网建议都连同一个路由器代理服务器填电脑IP端口默认8888保存后立即在Charles弹出的授权提示点Allow常见问题排查如果没弹出授权提示检查防火墙是否拦截了8888端口Android手机可能需要关闭私有DNS设置-网络和互联网-私有DNS部分企业WiFi会禁止代理建议用手机热点测试3. HTTPS抓包全攻略3.1 证书安装的坑点要让Charles解密HTTPS流量必须安装根证书。这个过程看似简单但藏着不少雷Mac电脑端通过Help - SSL Proxying - Install Charles Root Certificate安装钥匙串访问中找到Charles Proxy...证书右键-显示简介-信任里改成始终信任iOS设备手机Safari访问chls.pro/ssl下载配置设置-已下载描述文件-安装关键步骤设置-通用-关于本机-证书信任设置里启用Android的特别说明从Android 7开始系统不再信任用户安装的证书。解决方法有两种在app的network_security_config.xml中添加Charles证书使用模拟器或root过的设备测试环境推荐3.2 SSL代理配置安装证书后还需要设置SSL代理// 推荐的通配符配置 *.* // 拦截所有域名 // 或者指定特定域名 *.example.com api.yourapp.com:443遇到过最诡异的问题是某些CDN域名会证书校验失败这时候需要在Proxy - SSL Proxying Settings里排除这些域名。去年分析一个视频加载问题就是因为漏掉了akamai的CDN域名。4. 高阶Mock测试技巧4.1 Map Local实战用Map Local做Mock测试时我总结了一套高效工作流先正常请求一次接口在Charles里右键点击响应 - Save Response用VS Code修改保存的json文件推荐安装JSON插件校验格式右键原请求 - Map Local - 选择修改后的文件勾选Enable Map Local全局生效性能优化技巧当需要Mock大量接口时可以使用{}空对象代替完整响应提升速度用/path/*通配符匹配同一类接口在Map Local设置里开启缓存适合静态数据4.2 Breakpoints的妙用断点功能特别适合测试异常流程在需要拦截的接口上右键 - Breakpoints触发请求后会暂停在Request阶段此时可以修改Query参数测试边界值篡改JSON body模拟异常数据直接点击Execute跳过发送测试超时有个经典案例我们曾用这个方法模拟微信支付回调超时发现了订单状态机的一个严重bug。通过在Breakpoint里暂停请求15分钟复现了支付中心超时导致的双重扣款问题。5. 弱网测试与性能分析5.1 精准模拟弱网环境Charles的弱网模拟藏在Proxy - Throttle Settings里几个关键参数带宽模拟2G/3G/4G建议值2G15-50kbps3G200-800kbps4G2-10Mbps延迟移动网络建议100-500ms丢包率1%-5%就能制造明显卡顿实测发现随机性波动比固定值更接近真实场景。可以勾选Use random settings within limits让参数自动浮动。5.2 性能瓶颈定位通过Sequence视图可以直观看到哪些请求是串行的优化重点大体积资源检查是否启用压缩重复请求可能需要缓存我常用的优化套路对超过1秒的请求打标签右键 - Add Comment用Filter过滤特定类型请求如图片/video导出HAR文件用其他工具深度分析曾经帮一个电商App做性能优化就是通过Charles发现他们的商品详情页竟然顺序加载了12个JS文件改成并行加载后首屏时间直接降了40%。6. 企业级应用实践在大型项目中我推荐这些进阶用法团队协作方案用Session文件保存抓包记录.chls通过Tools - File - Export/Import共享配置建立公共的Map Local映射目录自动化测试集成配合Postman的Mock Server用Charles CLI模式批量执行通过REST API动态修改代理设置安全测试场景拦截修改JWT token测试权限控制重放请求测试接口幂等性修改响应状态码测试异常处理记得去年做金融App测试时我们通过Charles修改加密参数的方式发现了签名校验机制的漏洞。这种测试用常规手段很难覆盖但用Charles只需要三步操作。7. 避坑指南最后分享几个血泪教训内存管理长时间抓包可能导致内存暴涨建议设置自动保存Tools - Auto Save定期清理无用的session启用滚动日志View - Scroll During Recording隐私数据抓包可能包含敏感信息务必开启SSL代理白名单用Obfuscate功能脱敏及时删除测试session设备兼容性iOS 15需要额外信任证书Android 10可能需修改APK配置某些品牌手机如华为有特殊安全限制最近遇到个典型case某款国产手机无论如何都无法抓包最后发现是系统自带的网络加速功能导致的关闭后立即正常。这类问题没有通用解法需要耐心排查。