1、抓包配置
(1)Charles基础配置
- **注意:**火狐、谷歌浏览器不走系统代理,谷歌可以安装使用
SwitchyOmega
插件实现走系统代理(Charles设置成了系统代理);
(2)Charles电脑证书配置抓取https
注意: 有点链接经过安全处理,就算全部都设置了也是无法抓包的;
A、安装证书
B、 Charles 端设置 ssl
(3)Charles移动端代理配置
-
- 设备和电脑处于同一 WIFI(模拟器不需要配置);
-
- Charles设置允许安装异动端证书;
-
- 手机WiFi设置代理ip和端口;
-
- 手机安装证书;
- 系统浏览器访问 chls.pro/ssl;
- iOS:描述文件中安装证书;
- iOS:信任证书;
(4)注意事项
- Android 6 以上的系统 app 默认不信任抓包证书;
- 需要开发修改代码打开抓包的开关;
- 也或许要把网络ip设置到服务器白名单;
- iPhone 10 系统以上需要在 设置->通用->关于本机->证书信任设置 中打开信任开关;
2、过滤
- Filter
- Focus
3、重发
- 简单重发:鼠标右键 – Repeat;
- 简单压力:鼠标右键 – Repeat Advanced;
简单重发:
简单压力:
4、修改请求
- 鼠标右键 – Compose
- 选择接口 – 点击小钢笔图标
5、 断点(BreakPoint)
-
调整接口的参数信息;
-
鼠标右键 — Breakpoint(会进行默认对请求和响应都打上断点,可以按以下步骤对断点重新设置);
- Proxy – Breakpoint settings 设置断点;
- 确定接口信息,确定是请求断点还是响应断点;
- 重新发送请求 – 进入断点修改状态 – 修改内容 – 点击 Excute;
-
**注意:**这个方式看情况使用,因为大部分接口都是设置了超时时间,如果超时之后会重新发送一次请求,那打的断点就没用了!
6、弱网测试
(1)什么是弱网测试
- 按照移动的特性,一般应用低于 3G、弱信号的 Wifi 可以划分为弱网;
- 弱网测试是健壮性测试的重要部分,对移动端测试必不可少;
- 弱网测试主要进行弱网状态下的功能测试,同时关注用户体验;
(2)使用Charles完成弱网测试
- 本质是控制数据流量的传输;
- 带宽;
- 丢包;
- 延迟;
7、Charles接口数据mock
(1) Mock 测试的场景
- 前后端数据交互;
- 第三方系统数据交互;
- 硬件设备解耦;
(2) Mock 测试的价值与意义
- 不依赖第三方数据;
- 节省工作量;
- 节省联调;
(3) Mock 核心要素
- 匹配规则:哪个接口、哪些数据、数据格式;
- 模拟响应:符合匹配规则之后对响应内容进行篡改;
(4)Rewrite
提示:常使用于小范围数据篡改;
A、Rewrite原理
B、使用Rewrite对雪球app行情页面数据进行篡改
a、找到行情数据对于接口
https://stock.xueqiu.com/v5/stock/screener/quote/list.json?order=desc&size=50&type=sh_sz_bj&page=1&market=CN&order_by=turnover_rate&_t=1HUAWEIa8b36b4b795dac065715ff3b4466e765.1221824497.1697076047627.1697078856693&_s=083712
b、对接口进行Rewrite设置
- Tools → Rewrite;
- 勾选 Enable Rewrite;
- 点击下方 Add 按钮新建一个重写的规则;
- 在右侧编辑重写规则;
- 点击 ok 生效;
篡改响应体:股票名称和换手率
篡改请求头:修改、增加请求头
篡改请求参数:增加请求参数
(5)Map Local
**提示:**只想修改响应体中的数据的时候使用;
A、Map Local原理
B、使用Map Local对雪球app行情页面数据进行篡改
- 步骤:
- 1、准备本地接口响应数据;
- 2、配置 Map Local;
- 选择要进行 Map Local 的接口;
- 鼠标右键 – 选择 Map Local 选项进入设置界面;
- Map From 填写接口的信息;
- Map To 选择本地文件;
- 3、修改 Map Local 配置:Tools – Map Local;
(6)Map Remote
A、Map Remote原理
B、Map Remote使用
-
场景
- 访问百度,转发至豆瓣;
- 访问开发环境,转发至测试环境;
-
操作
- 选择接口,点击鼠标右键,选择 Map Remote 进入到设置页面;
- 设置重定向的接口信息;
- 点击 ok 生效;
- 修改设置:Tools – Map Remote 找对对应接口双击进入修改界面;
访问百度,转发至豆瓣:
8、 Mock 技术体系介绍
(1) Test Double 测试替身
- Dummy 占位对象 对象被传递但从未实际使用过。通常它们仅用于填充参数列表。
- Fake 假对象 对象实际上有工作实现,但通常采取一些捷径,这使得它们不适合生产(内存数据库就是一个很好的例子)。
- Stubs 桩对象 为测试期间调用提供预设答案,通常根本不响应任何超出测试程序的内容。
- Spies 间谍对象 它们还根据调用方式记录一些信息。其中一种形式可能是电子邮件服务,它记录发送了多少消息。
- Mocks 模拟对象 是我们在这里谈论的:预先编程的对象,这些期望形成了它们期望接收的调用的规范。
测试替身关键概念的区别:
(2) 一个真实的技术架构例子
- dummy 只要端口开着就行
- fake 内存数据库
- spy UI 界面后端请求记录
- stub 假的登录后端服务
- hook 新用户判断方法修改
- proxy 代理转发机制
- mock 模拟对象
(3) Fake 假对象 定义
- 定义:假对象实际上有工作实现,但通常采取一些捷径,这使得它们不适合生产(纯内存数据库就是一个很好的例子)。
- 比如:登录需要查数据库,但是此时数据库是没有实现的,那就通过在内存中创建一个HashMap来提供假的数据库中的数据对象,从而实现获取登录数据的场景,HashMap中也实现了对登录数据的校验,只是整个过程实际上是没有走数据库的,其他所有逻辑都有,也进行了真实的数据查询和校验;
Fake 应⽤场景:
(4) Stub 桩定义
- 定义:为测试期间调用提供预设答案,通常根本不响应任何超出测试程序的内容。
- 比如:在需要查询数据库情况下,根本就不去查,而是直接就返回了需要的数据,没有任何处理逻辑,就是简单地的你要什么我给你什么就行,直接写死的内容;
Stub 应⽤场景:
1、Swagger就是这种方式;swagger使用场景
2、 Moco Easy Setup Stub Server;
java -jar moco-runner-1.2.0-standalone.jar http -p 12345 -c foo.json
{
"request" :
{
"uri" : "/foo",
"queries" :
{
"param" : "blah"
}
},
"response" :
{
"text" : "bar"
}
}
说明: 只要给参数"blah",那就给你结果 “bar”,很直接,没有任何逻辑;
(5) Mock 模拟对象定义
- 定义:模拟、预编程了期望,这些期望形成了他们期望接收的调用的规范。如果他们收到了他们不期望的调用,他们可以抛出异常,并在验证过程中进行检查以确保他们得到了他们期望的所有调用。
- 使用场景:
- mock on stub:按需返回期望数据;
- mock on proxy:按需返回真实数据的修改副本;
9、 常⽤的 Mock 工具
- Charles 测试工程师常用;
- BurpSuite 黑客常用;
- Fiddler 只能 Windows 上使用;
- Nginx 服务器反向代理与修改;
- Mitmproxy 代理工具 可python编程;
- python第三方库:
mitmproxy
;
- python第三方库:
- Wiremock(基于java开发) 代理工具 可java编程;
(1)mitmproxy
- 说明:
mitmproxy is a set of tools that provide an interactive, SSL/TLS-capable intercepting proxy for HTTP/1, HTTP/2, and WebSockets.
A、 mitmproxy mock on proxy
简单案例:
python3 -m http.server
mitmdump -p 8001 -m reverse:127.0.0.1:8000 --flow-detail 4 -B '/~bs .*Directory.*/Directory/ceshiren.com mock'
说明:
1、先开启了一个服务;
2、开启了一个8001端口,反向代理了8000端口,给定条件:当内容中出现Directory
的时候,把他替换成ceshiren.com mock
;
B、 mitmproxy 强大的插件机制 Addons
- dns
- tcp
- cert
- http/https
- websocket
C、python第三方库:mitmproxy
import sys
from mitmproxy import ctx
from mitmproxy import tcp
from mitmproxy.utils import strutils
from mitmproxy.tools.main import mitmdump
def tcp_message(flow: tcp.TCPFlow):
message = flow.messages[-1]
old_content = message.content
message.content = old_content.replace(
b":0;localabstract:webview_devtools_remote_",
b": 0;localabstract:xweb_devtools_remote_"
)
ctx.log.info(
"[tcp_message{}] from {} to {}:\n{}".format(
" (modified)" if message.content != old_content else "",
"client" if message.from_client else "server",
"server" if message.from_client else "client",
strutils.bytes_to_escaped_str(message.content))
)
if __name__ == '__main__':
sys.argv = ["", "-p", "5038", "--rawtcp", "--mode", "reverse:http://localhost:5037/", "-s", sys.argv[0], "-vv"]
mitmdump()