charles的MOCK方法

七言 2025-8-1 11 8/1

[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进行取消修改

charles的MOCK方法

Breakpoints

  • Charles 的 Breakpoints 就像一个“暂停键 + 修改器”:
  • 临时打断请求,手动改响应
  • 它会在请求发出前、或响应返回前把包截住,让你临时修改里面的任何内容(URL、Header、Body、状态码等),再继续发出去或返回给客户端。
  • 适合一次性调试、验证容错逻辑、或做“非固定”的 Mock

什么场景用 Breakpoints?

场景 示例说明
✅ 临时改个字段 把 “score”: 100 改成 999,看前端是否刷新
✅ 模拟异常状态 把 200 改成 500,看错误提示是否正确
✅ 临时换 URL 把 /api/v1/info 改成 /api/v2/info
✅ 注入脏数据 把用户名字段改成超长字符串,测 UI 边界
✅ 临时加 Header 加一个 Authorization 头,测鉴权逻辑

使用步骤

  1. 找到你想要的链接右键勾选Breakpoints功能,工具栏的断点图标就会变红

charles的MOCK方法

  1. 设置断点,“Proxy”->“Breakpoints”,弹出Breakpoints Settings 弹窗

charles的MOCK方法

  1. 双击Location中的想要打断点的接口,弹出Edit Breakpoints,将Query中的内容删除,输入*;如果修改Request数据,就将Request勾选;如果修改Response数据,就将Response勾选;

charles的MOCK方法

  1. 此时重新访问该接口,Charles自动跳转到Breakpoints页面,此时修改Response数据,点击Edit Response,切换底部tab至Text,修改所需要的数据,再点击Execute

charles的MOCK方法

Map Local

  • Charles的 Map Local功能=“把线上接口的数据偷换成你本地准备好的文件”。
  • 一句话:它让某个 URL的请求不再去服务器,而是直接返回你硬盘里的 json/html/图片等任何文件,常用于 Mock 数据、边界测试、前端并行开发

什么场景用 Map Local?

场景 举例
✅ 后端接口没好 前端要调试列表,先用本地 list.json 顶着
✅ 造异常/边界数据 把返回码 200 改成 500,或把列表塞 1000 条
✅ 第三方接口收费/限流 用本地文件代替真实调用
✅ DEMO/培训 演示时保证数据可控,不受网络影响

使用步骤

  1. 抓包:在 Charles 里找到目标接口-->右键 Save Response 保存原始返回

charles的MOCK方法

  1. 编辑:用文本软件(如notepad++或者sublime等)/IDE把文件改成你想要的样子(格式必须与原接口一致)

  2. 选择该请求-->右键找到Map Local-->在Edit Mapping弹窗-->Map To下的Local Path选择修改后的本地文件,并点击OK

charles的MOCK方法

  1. 再次请求接口,查看接口响应即可

  2. 如果不再进行接口MOCK,在charles的Tools-->点击Map Local-->Map Local Settings弹框取消勾选Enable Map Local

charles的MOCK方法

注意:可针对多个接口,进行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 字段

操作步骤

  1. 菜单栏-->Tools-->Rewrite-->勾选 Enable Rewrite

  2. 点击Add-->配置规则(Location+Type) 2.1. 新建规则集:Localtion处点击Add添加服务器请求地址等

    • Name:规则集名称(如 user-info-rewrite)
    • Protocol:协议,一般为https
    • Host:服务器地址
    • Port:端口号
    • Path:跟在服务器地址后面的接口路径(//或/符号需要带)
    • Query:填写 *

charles的MOCK方法

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 里括号捕获的分组
  • 常用正则符号对照表

符号 含义 示例
. 匹配除换行符以外的任意单个字符 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"}

charles的MOCK方法

  • 设置完成后勾选对应规则集,点击OK,想临时关闭-->把 Enable Rewrite 取消即可,无需删除规则
- THE END -

七言

8月01日15:55

最后修改:2025年8月1日
0

非特殊说明,本博所有文章均为博主原创。

共有 0 条评论