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
- 找到你想要的链接右键勾选Breakpoints功能,工具栏的断点图标就会变红
- 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 里找到目标接口-->右键 Save Response 保存原始返回
- 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→ Replace500Body 改响应体 Match "score":\d+→ Replace"score":999(勾选 Regex)Add Header 增请求头 Header Name x-mock, ValuetrueURL 改完整地址 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 里括号捕获的分组 -
常用正则符号对照表 符号 含义 示例 .匹配除换行符以外的任意单个字符 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 取消即可,无需删除规则
- THE END -
最后修改:2025年8月16日
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:https://www.qian777.cn/41.html
共有 0 条评论