[TOC]
MOCK
- Mock 就是在测试过程中,对于一些不容易构造/获取的对象,创建一个 Mock对象来模拟对象的行为
什么场景需要MOCK
✅ 一句话总结: 只要后端接口还没好、或你想测试异常情况、或想隔离依赖,就需要 Mock
- 具体场景举例:
场景 | 是否需要 Mock | 为什么? |
---|---|---|
✅ 前端开发,后端接口还没写好 | 需要 | 前端不能等后端,Mock 数据让页面先跑起来。 |
✅ 测试边界值 / 异常情况 | 需要 | 比如测试“余额不足”、“网络超时”,后端不一定能稳定复现。 |
✅ 第三方接口不稳定 / 收费 | 需要 | 比如支付、地图、AI 服务,Mock 避免频繁调用或超预算。 |
✅ 演示 DEMO / 产品原型 | 需要 | 快速展示功能,不需要真实后端。 |
✅ 自动化测试 / 单元测试 | 需要 | 隔离外部依赖,确保测试稳定。 |
❌ 集成测试 / 联调阶段 | 不需要 | 此时要用真实接口验证端到端逻辑。 |
- 举个例子:
- 你在开发一个**“用户余额提现”**功能:
- 后端接口还没好 → Mock 一个提现成功的 JSON。
- 想测试“余额不足”提示 → Mock 返回错误码 400。
- 想测试“网络超时” → Charles 里设置延迟 10 秒。
- 你在开发一个**“用户余额提现”**功能:
charles的MOCK
- 常用Map Local和Rewrite
Compose
-
Composer允许自定义请求发送到服务器,可对接口的数据进行编辑后重新发送
-
选中要修改的请求,右击-->Compose,自动填充该HTTP请求接口的相关信息,我们可以进行原数据修改或者Add添加后,点击Execute进行发送,Cancel进行取消修改
Breakpoints
- Charles 的 Breakpoints 就像一个“暂停键 + 修改器”:
- 临时打断请求,手动改响应
- 它会在请求发出前、或响应返回前把包截住,让你临时修改里面的任何内容(URL、Header、Body、状态码等),再继续发出去或返回给客户端。
- 适合一次性调试、验证容错逻辑、或做“非固定”的 Mock
什么场景用 Breakpoints?
场景 | 示例说明 |
---|---|
✅ 临时改个字段 | 把 “score”: 100 改成 999,看前端是否刷新 |
✅ 模拟异常状态 | 把 200 改成 500,看错误提示是否正确 |
✅ 临时换 URL | 把 /api/v1/info 改成 /api/v2/info |
✅ 注入脏数据 | 把用户名字段改成超长字符串,测 UI 边界 |
✅ 临时加 Header | 加一个 Authorization 头,测鉴权逻辑 |
使用步骤
- 找到你想要的链接右键勾选Breakpoints功能,工具栏的断点图标就会变红
- 设置断点,“Proxy”->“Breakpoints”,弹出Breakpoints Settings 弹窗
- 双击Location中的想要打断点的接口,弹出Edit Breakpoints,将Query中的内容删除,输入*;如果修改Request数据,就将Request勾选;如果修改Response数据,就将Response勾选;
- 此时重新访问该接口,Charles自动跳转到Breakpoints页面,此时修改Response数据,点击Edit Response,切换底部tab至Text,修改所需要的数据,再点击Execute
Map Local
- Charles的 Map Local功能=“把线上接口的数据偷换成你本地准备好的文件”。
- 一句话:它让某个 URL的请求不再去服务器,而是直接返回你硬盘里的 json/html/图片等任何文件,常用于 Mock 数据、边界测试、前端并行开发
什么场景用 Map Local?
场景 | 举例 |
---|---|
✅ 后端接口没好 | 前端要调试列表,先用本地 list.json 顶着 |
✅ 造异常/边界数据 | 把返回码 200 改成 500,或把列表塞 1000 条 |
✅ 第三方接口收费/限流 | 用本地文件代替真实调用 |
✅ DEMO/培训 | 演示时保证数据可控,不受网络影响 |
使用步骤
- 抓包:在 Charles 里找到目标接口-->右键 Save Response 保存原始返回
-
编辑:用文本软件(如notepad++或者sublime等)/IDE把文件改成你想要的样子(格式必须与原接口一致)
-
选择该请求-->右键找到Map Local-->在Edit Mapping弹窗-->Map To下的Local Path选择修改后的本地文件,并点击OK
-
再次请求接口,查看接口响应即可
-
如果不再进行接口MOCK,在charles的Tools-->点击Map Local-->Map Local Settings弹框取消勾选Enable Map Local
注意:可针对多个接口,进行Map Local修改。若不想针对某接口进行MOCK,在charles的Tools-->点击Map Local-->Map Local Settings弹框-->选择对应Location取消勾选或取消Enable Map Local后再单独对需要修改的接口进行Map Local
Rewrite
-
Charles 的 Rewrite 功能 = “批量 + 长期 + 可正则”的在线修改器。
-
它能在请求/响应经过Charles时,自动且批量地修改URL、Header、参数、状态码、Body 等任何文本内容,适合需要长期规则化替换的场景
-
一句话:Map Local 只能换整个文件,Breakpoints 只能临时改一次,Rewrite 介于两者之间:批量、长期、可正则,随时开关
什么场景使用Rewrite?
场景 | 举例 |
---|---|
✅ Mock 动态数据 | 把响应中 "score":\d+ 批量替换为 "score":999 |
✅ 统一加请求头 | 给某域名的所有请求自动加上 token: abc123 |
✅ 统一改状态码 | 把某接口 500 全部改成 200,方便前端调试 |
✅ 批量换域名 | 把测试环境的 api.test.com 换成 api.mock.com |
✅ 删除敏感字段 | 统一响应里删除 phone 字段 |
操作步骤
-
菜单栏-->Tools-->Rewrite-->勾选 Enable Rewrite
-
点击Add-->配置规则(Location+Type) 2.1. 新建规则集:Localtion处点击Add添加服务器请求地址等
- Name:规则集名称(如 user-info-rewrite)
- Protocol:协议,一般为https
- Host:服务器地址
- Port:端口号
- Path:跟在服务器地址后面的接口路径(//或/符号需要带)
- Query:填写
*
2.2. 添加具体规则:Type | Action 处点击Add添加Rewrite Rule
- 可一次性添加多个rule,如果要替换同一json内多个字符的值是建议分开创建多个规则集,每个规则集创建一个对应字段的rule,方便修改和验证rule是否正确
Type | 说明 | 示例 |
---|---|---|
Response Status | 改状态码 | Match 200 → Replace 500 |
Body | 改响应体 | Match "score":\d+ → Replace "score":999 (勾选 Regex) |
Add Header | 增请求头 | Header Name x-mock , Value true |
URL | 改完整地址 | Match /v1/ → Replace /v2/ |
Remove Query Param | 删参数 | Param Name debug |
-
Type:一般用来重写body,对请求的响应内容做修改,一般是对某一个或几个值进行rewrite
-
where:选择重写请求Request 还是响应 Response(大多数只修改响应)
-
Match:Value输入被替换值,使用正则表达式时需要勾选Regex
- Match 必须能“精准定位”到你想改的那一段 JSON 字符串
-
Replace:Value输入替换值,Replace first--替换第一个;Replace all--替换全部
- Replace 里可以用
$1
、$2
… 反向引用 Match 里括号捕获的分组
- Replace 里可以用
-
常用正则符号对照表
符号 | 含义 | 示例 |
---|---|---|
. |
匹配除换行符以外的任意单个字符 | a.c → abc、aec |
^ |
匹配字符串/行开头 | ^abc → 以 abc 开头 |
$$ |
匹配字符串/行结尾 | abc$ → 以 abc 结尾 |
* |
前一个字符 0 次或多次 | a*b → b、ab、aab |
+ |
前一个字符 1 次或多次 | a+b → ab、aab |
? |
前一个字符 0 或 1 次 | a?b → b、ab |
{n} |
精确匹配 n 次 | \d{3} → 123 |
{n,} |
至少匹配 n 次 | \d{2,} → 12、123 |
{n,m} |
匹配 n 到 m 次 | \d{2,4} → 12、123、1234 |
[] |
字符集合,匹配其中任意一个 | [abc] → a 或 b 或 c |
[^] |
否定字符集,匹配不在集合中的字符 | [^0-9] → 非数字 |
() |
分组并捕获,供反向引用 | (\d+)-(\d+) → 用 $1 、$2 引用 |
\| |
或(逻辑或) | cat\|dog → cat 或 dog |
\d |
任一数字(0-9) | \d{11} → 手机号 |
\D |
任一非数字 | \D+ → abc |
\w |
字母、数字或下划线 | \w+ → user_01 |
\W |
任一非 \w 字符 |
\W+ → !@# |
\s |
任一空白字符(空格、Tab、换行) | \s+ → 一个或多个空格 |
\S |
任一非空白字符 | \S+ → 非空字符串 |
\ |
转义符,把特殊符号变成普通字符 | \. → 匹配小数点 |
\b |
单词边界 | \bcat\b → 匹配单词 cat |
\A |
字符串绝对开头(不受多行模式影响) | \Aabc |
\Z |
字符串绝对结尾(不受多行模式影响) | xyz\Z |
- 可用模板
目的 | Match(勾 Regex) | Replace | 说明 |
---|---|---|---|
改固定 key 的固定值 | "score":\d+ |
"score":999 |
把 "score":123 → "score":999 |
改固定 key 的动态值 | "name":".*?" |
"name":"李四" |
任意原名 → 李四 |
捕获并复用旧值 | "old_time":(\d+) |
"new_time":$1,"old_time":$1 |
把旧值保存到新字段 |
整段 JSON 替换 | \{.*"vip":1.*\} |
{"a":1,"vip":0} |
整段覆盖,注意转义 { } |
- 例如:
目标 | Match(勾 Regex) | Replace | 结果 |
---|---|---|---|
把 "score":123 改成 "score":999 |
"score":\d+ |
"score":999 |
任意数字 → 999 |
把 "name":"张三" 改成 "name":"李四" |
"name":"([^"]*)" |
"name":"李四" |
任意原名 → 李四 |
把 "a":1,"b":2 整体替换为 "a":9,"b":9 |
"a":\d+,"b":\d+ |
"a":9,"b":9 |
整段覆盖 |
保留原值并追加字段 | "count":(\d+) |
"count":$1,"double":$1 |
例:"count":5 → "count":5,"double":5 |
✅ 完整示例:动态替换用户 ID 并追加字段
原响应片段
"user":{"id":123,"name":"Tom"}
Match(正则)
"user":\{"id":(\d+),"name":"([^"]+)"\}
Replace
"user":{"id":$1,"name":"$2","display":"$2_$1"}
结果
"user":{"id":123,"name":"Tom","display":"Tom_123"}
- 设置完成后勾选对应规则集,点击OK,想临时关闭-->把 Enable Rewrite 取消即可,无需删除规则
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:https://www.qian777.cn/41.html
共有 0 条评论