Apifox中证明Mock数据的正确性是为了保证Mock服务能可靠地模拟真实后端行为。
一、 三层证明模型
一个Mock测试证明应包含三个方面:
结构层:数据格式、类型、必填项是不是正确。
规则层:数据值是不是符合业务规则(如手机号格式、状态枚举)。
思路层:数据的动态思路是不是准确(如分页连续性、业务状态流转)。
二、 方法和实践
方法一:根据JSON Schema的静态结构证明基础
这是最基础、最可靠的自动化证实方式。Apifox支持。
流程:
定义严谨的Schema:在接口的“返回响应”中,使用 JSON Schema 方式,详细定义每个字段的 type、format、required、enum、pattern(正则)等规则。
启用“响应检查”:在Apifox的 “设置”->“全局设置”->“测试设置” 中,开启 “自动检查返回数据是不是符合接口定义”。
自动化证实:每次通过Apifox发送请求到Mock地址后,系统会自动将返回的Mock数据和Schema进行比对,并在 “测试结果” 选项卡中确定提示检查通过和否,以及具体的失败原因(如“字段userId类型应为integer,实际为string”)。
最好方法:将枚举值、正则表达式等约束直接定义在Schema中,让Schema本身成为唯一可信源,Mock生成和自动化测试都根据这个方式
方法二:利用高级Mock期望证明动态情形
当需要模拟不同输入对应不同输出(如登录成功/失败)时,高级Mock期望是实现并证实正确性的工具。
流程:
创建情形化期望:在接口的 “高级Mock” 标签页下,点击“创建期望”。如,为登录接口创建两个期望:
登录成功
条件:请求Body JSONPath 为 $.username 等于 correctUser。
响应:{"code": 0, "message": "成功", "data": {...}}。
用户不存在
条件:请求Body JSONPath 为 $.username 等于 unknownUser。
响应:{"code": 1001, "message": "用户不存在", "data": null}。
执行测试:
在“运行”选项卡,分别用 {"username": "correctUser", ...} 和 {"username": "unknownUser", ...} 作为请求体,调用Mock地址。
证实点:严格检查返回的 code、message 和数据结构是不是和对应期望的设置完全一致。这证实了Mock服务能否正确进行条件路由。
方法三:通过自定义Mock脚本实现
对于需要复杂动态思路(如根据请求参数计算返回值、生成关联数据)的情形,必须使用自定义JavaScript脚本来证实思路正确性。
操作流程:
编写脚本:在“高级Mock”中为接口或期望启用“自定义脚本”。
在脚本中植入证实思路:除了生成数据,脚本应包含确定的思路断言。
javascript
// 示例:证实分页参数思路,并生成对应数据
module.exports = async function (context) {
let { page, size } = context.request.query; // 获取请求参数
page = parseInt(page) || 1;
size = parseInt(size) || 10;
// ====== 证实思路1:参数检查 ======
if (page < 1) {
// 模拟业务异常返回
return { code: 400, message: '页码参数错误' };
}
// ====== 证实思路2:生成符合思路的动态数据 ======
const total = 125; // 模拟总数据量
const totalPages = Math.ceil(total / size);
const startId = (page - 1) * size + 1;
// 生成当前页数据列表
const list = Array.from({ length: Math.min(size, total - (page-1)*size) }, (_, i) => ({
id: startId + i,
title: `Mock Item ${startId + i}`
}));
// ====== 证实思路3:返回结构 ======
return {
code: 0,
data: {
list,
page,
size,
total,
totalPages,
// 证实思路4:分页连续性判断
hasNext: page < totalPages,
hasPrev: page > 1
}
};
};
脚本输出:
使用多组边界参数(如 page=0, size=500、page=999)调用Mock。
异常参数是不是返回预期的错误码和提示。
生成的数据ID是不是连续、列表长度是不是正确。
分页元数据(hasNext, totalPages)计算是不是准确。