测试动态 / 测试知识 / Apifox Mock脚本进阶:使用JavaScript自定义响应逻辑
Apifox Mock脚本进阶:使用JavaScript自定义响应逻辑
2025-12-31 作者:cwb 浏览次数:6

Apifox的Mock脚本功能允许你使用JavaScript深度自定义Mock服务的响应思路,实现从简单数据替换到复杂业务仿真的全方面控制。


Mock脚本的生命周期和执行阶段

每个可编写脚本阶段的具体作用、能访问的变量(API)和常见用途。


Before:请求到达时最先执行,主要用于修改接收到的请求信息。

apifox: 重要对象,用于存取请求值。

apifox.getRequestHeader(): 获取请求头。

apifox.setRequestHeader(): 设置请求头。

apifox.getRequestQuery(): 获取查询参数。

apifox.setRequestQuery(): 设置查询参数。1. 参数重写或补充(如注入测试token),2. 请求头证实和修改 ,3. 请求路由(初步判断)


After:在Apifox一致到本地/云端Mock规则后执行,是生成动态响应内容的重要阶段。

apifox: 重要对象,用于设置响应。

apifox.mockResponse.setStatusCode(): 设置HTTP状态码。

apifox.mockResponse.setHeader(): 设置响应头。

apifox.mockResponse.setBody(): 设置响应体(支持JSON/文本等)。

apifox.getRequestQuery()等: 仍可获取请求信息。1. 根据请求参数动态生成数据,2. 实现分页、搜索等业务思路,3. 生成随机但符合规则的数据(如手机号、身份证),4. 模拟接口成功、失败或异常状态


Tescase (Beta):在After阶段之后执行,主要用于一致并返回特定的测试用例数据。apifox.testcase.系列方法,用于一致和返回预置的用例数据。

1. 针对特定参数返回设定义的复杂或边界值用例数据

2. 实现精确的情形化Mock


代码示例

1. 操作请求信息 (Before 脚本)

在请求被处理前,你可以检查和修改它。


javascript

// 示例:在Before脚本中证实并补充参数

const token = apifox.getRequestHeader('Authorization');

// 情形1: 证实Token

if (!token || !token.startsWith('Bearer ')) {

    // 可以提前设置一个错误响应,后续After脚本可以根据此返回

    apifox.setVariable('authError', true);

}


// 情形2: 为所有请求添加一个时间戳查询参数

const query = apifox.getRequestQuery();

query.timestamp = new Date().getTime();

apifox.setRequestQuery(query);


// 情形3: 根据请求头进行简单路由标识

const clientType = apifox.getRequestHeader('X-Client-Type');

apifox.setVariable('client', clientType || 'default');


2. 生成动态响应 (After 脚本)

这是最重要的部分,可以根据请求生成千变万化的响应。


javascript

// 示例1:模拟一个带分页的用户列表查询接口

const query = apifox.getRequestQuery();

const page = parseInt(query.page) || 1;

const size = parseInt(query.size) || 10;

const total = 125; // 模拟总数据量


// 生成当前页的模拟数据

const list = [];

for (let i = 0; i < size && (page - 1) * size + i < total; i++) {

    const id = (page - 1) * size + i + 1;

    list.push({

        id: id,

        name: `用户${id}`,

        // 使用Mock.js语法生成更真实的数据(需保证Apifox环境支持)

        email: Mock.mock('@email'),

        createTime: Mock.mock('@datetime')

    });

}


// 设置响应

apifox.mockResponse.setStatusCode(200);

apifox.mockResponse.setHeader('Content-Type', 'application/json');

apifox.mockResponse.setBody(JSON.stringify({

    code: 0,

    message: 'success',

    data: {

        list: list,

        page: page,

        size: size,

        total: total,

        hasNext: page * size < total

    }

}));


// 示例2:根据请求体参数模拟登录成功/失败

try {

    const rawBody = apifox.getRequestBody(); // 获取原始请求体

    const body = JSON.parse(rawBody);

    const { username, password } = body;


    if (username === 'admin' && password === '123456') {

        apifox.mockResponse.setBody(JSON.stringify({

            code: 0,

            message: '登录成功',

            data: { userId: 1, token: Mock.mock('@guid'), role: 'admin' }

        }));

    } else {

        apifox.mockResponse.setBody(JSON.stringify({

            code: 1001,

            message: '用户名或密码错误'

        }));

    }

} catch (error) {

    // 处理请求体分析错误等异常

    apifox.mockResponse.setStatusCode(400);

    apifox.mockResponse.setBody(JSON.stringify({ error: '无效的请求格式' }));

}



3. 使用内置库和随机数据

Apifox Mock环境一般内置了Mock.js和Lodash等实用库。


javascript

// 假设Mock.js和_ (lodash)可用

// 生成一个逼真的模拟用户列表

const getRandomUserList = (count) => {

    return _.times(count, (i) => ({

        id: Mock.mock('@id'),

        name: Mock.mock('@cname'),

        avatar: Mock.mock('@image("100x100")'),

        province: Mock.mock('@province'),

        city: Mock.mock('@city'),

        email: Mock.mock('@email'),

        ip: Mock.mock('@ip'),

        // 生成随机手机号:1开头,第二位是3-9,后面9位随机

        phone: `1${_.random(3,9)}${Mock.mock(/\d{9}/)}`,

        lastLogin: Mock.mock('@datetime("yyyy-MM-dd HH:mm:ss")')

    }));

};


// 使用函数

const userList = getRandomUserList(10);

apifox.mockResponse.setBody(JSON.stringify(userList));


高级示例

情形一:根据数据库或状态的模拟

模拟需要记忆状态的接口,如领取优惠券、增减库存。


javascript

// 使用Apifox的变量或外部存储模拟状态(注意:变量作用域一般限于单次请求)

// 这是一个概念示例,实际持久化可能需要结合Apifox的“临时变量”或外部服务

let couponInventory = apifox.getVariable('couponInventory') || 100; // 初始库存


const query = apifox.getRequestQuery();

const userId = query.userId;


if (couponInventory > 0) {

    couponInventory--;

    apifox.setVariable('couponInventory', couponInventory); // 更新变量


    apifox.mockResponse.setBody(JSON.stringify({

        success: true,

        couponCode: Mock.mock('@string("upper", 12)'),

        remaining: couponInventory

    }));

} else {

    apifox.mockResponse.setBody(JSON.stringify({

        success: false,

        message: '优惠券已领完'

    }));

}


情形二:模拟延迟和超时


javascript

// 模拟网络延迟

const delay = apifox.getRequestQuery().delay;

const waitTime = parseInt(delay) || _.random(100, 2000); // 默认随机延迟

// 注意:在真实的Mock脚本环境中,可能不支持同步的sleep,延迟思路可能需要通过脚本执行机制本身或外部配置实现。

// 以下是一个概念示意:

// 实际实现时,可能需要依赖Apifox Mock服务的“延时响应”配置功能,或者使用异步写法。

apifox.mockResponse.setDelay(waitTime); // 假设有这样一个API


// 模拟超时(不返回响应)

const shouldTimeout = apifox.getRequestQuery().timeout === 'true';

if (shouldTimeout) {

    // 不调用setBody等方法,或设置一个极长的延迟,以模拟超时

    // 具体实现取决于Apifox Mock服务的行为

}


情形三:动态错误注入


javascript

// 根据一定概率或特定参数返回错误

const errorRate = 0.1; // 10%的错误率

const randomValue = Math.random();


if (randomValue < errorRate) {

    const errors = [

        { code: 500, message: '服务器内部错误' },

        { code: 503, message: '服务暂时不可用' },

        { code: 429, message: '请求过于频繁' },

        { code: 400, message: `无效参数: ${Mock.mock('@word')}` }

    ];

    const error = errors[_.random(0, errors.length - 1)];

    apifox.mockResponse.setStatusCode(error.code);

    apifox.mockResponse.setBody(JSON.stringify({ error: error.message }));

    return; // 注意提前结束

}

// ... 正常的成功响应思路


调试建议

控制台:在Apifox的Mock脚本编辑器中,使用 console.log() 输出变量值、执行途径。

检查语法:保证JavaScript语法正确,特别是JSON字符串的拼接和处理。

确定变量作用域:理解 apifox.setVariable 和 apifox.getVariable 设置的变量一般在单次请求生命周期内有效。

分步证明:对于复杂脚本,先写一个最小化可工作版本(如直接返回一个固定JSON),再逐步增加思路。

查看日志:在Apifox的Mock服务器日志中查看请求详情和可能的脚本错误信息。


文章标签: 软件测试 测试工具
热门标签 换一换
首版次软件认定 软件结题验收 软件测试报告书 软件质量检测 数据库测试 H5应用测试 软件质检机构 第三方质检机构 第三方权威质检机构 信创测评机构 信息技术应用创新测评机构 信创测试 软件信创测试 软件系统第三方测试 软件系统测试 软件测试标准 工业软件测试 软件应用性能测试 应用性能测试 可用性测试 软件可用性测试 软件可靠性测试 可靠性测试 系统应用测试 软件系统应用测试 软件应用测试 软件负载测试 API自动化测试 软件结题测试 软件结题测试报告 软件登记测试 软件登记测试报告 软件测试中心 第三方软件测试中心 应用测试 第三方应用测试 软件测试需求 软件检测报告定制 软件测试外包公司 第三方软件检测报告厂家 CMA资质 软件产品登记测试 软件产品登记 软件登记 CNAS资质 cma检测范围 cma检测报告 软件评审 软件项目评审 软件项目测试报告书 软件项目验收 软件质量测试报告书 软件项目验收测试 软件验收测试 软件测试机构 软件检验 软件检验检测 WEB应用测试 API接口测试 接口性能测试 第三方系统测试 第三方网站系统测试 数据库系统检测 第三方数据库检测 第三方数据库系统检测 第三方软件评估 课题认证 第三方课题认证 小程序测试 app测试 区块链业务逻辑 智能合约代码安全 区块链 区块链智能合约 软件数据库测试 第三方数据库测试 第三方软件数据库测试 软件第三方测试 软件第三方测试方案 软件测试报告内容 网站测试报告 网站测试总结报告 信息系统测试报告 信息系统评估报告 信息系统测评 语言模型安全 语言模型测试 软件报告书 软件测评报告书 第三方软件测评报告 检测报告厂家 软件检测报告厂家 第三方网站检测 第三方网站测评 第三方网站测试 检测报告 软件检测流程 软件检测报告 第三方软件检测 第三方软件检测机构 第三方检测机构 软件产品确认测试 软件功能性测试 功能性测试 软件崩溃 稳定性测试 API测试 API安全测试 网站测试测评 敏感数据泄露测试 敏感数据泄露 敏感数据泄露测试防护 课题软件交付 科研经费申请 软件网站系统竞赛 竞赛CMA资质补办通道 中学生软件网站系统CMA资质 大学生软件网站系统CMA资质 科研软件课题cma检测报告 科研软件课题cma检测 国家级科研软件CMA检测 科研软件课题 国家级科研软件 web测评 网站测试 网站测评 第三方软件验收公司 第三方软件验收 软件测试选题 软件测试课题是什么 软件测试课题研究报告 软件科研项目测评报告 软件科研项目测评内容 软件科研项目测评 长沙第三方软件测评中心 长沙第三方软件测评公司 长沙第三方软件测评机构 软件科研结项强制清单 软件课题验收 软件申报课题 数据脱敏 数据脱敏传输规范 远程测试实操指南 远程测试 易用性专业测试 软件易用性 政府企业软件采购验收 OA系统CMA软件测评 ERP系统CMA软件测评 CMA检测报告的法律价值 代码原创性 软件著作登记 软件著作权登记 教育APP备案 教育APP 信息化软件项目测评 信息化软件项目 校园软件项目验收标准 智慧软件项目 智慧校园软件项目 CSRF漏洞自动化测试 漏洞自动化测试 CSRF漏洞 反序列化漏洞测试 反序列化漏洞原理 反序列化漏洞 命令执行 命令注入 漏洞检测 文件上传漏洞 身份验证 出具CMA测试报告 cma资质认证 软件验收流程 软件招标文件 软件开发招标 卓码软件测评 WEB安全测试 漏洞挖掘 身份验证漏洞 测评网站并发压力 测评门户网站 Web软件测评 XSS跨站脚本 XSS跨站 C/S软件测评 B/S软件测评 渗透测试 网站安全 网络安全 WEB安全 并发压力测试 常见系统验收单 CRM系统验收 ERP系统验收 OA系统验收 软件项目招投 软件项目 软件投标 软件招标 软件验收 App兼容性测试 CNAS软件检测 CNAS软件检测资质 软件检测 软件检测排名 软件检测机构排名 Web安全测试 Web安全 Web兼容性测试 兼容性测试 web测试 黑盒测试 白盒测试 负载测试 软件易用性测试 软件测试用例 软件性能测试 科技项目验收测试 首版次软件 软件鉴定测试 软件渗透测试 软件安全测试 第三方软件测试报告 软件第三方测试报告 第三方软件测评机构 湖南软件测评公司 软件测评中心 软件第三方测试机构 软件安全测试报告 第三方软件测试公司 第三方软件测试机构 CMA软件测试 CNAS软件测试 第三方软件测试 移动app测试 软件确认测试 软件测评 第三方软件测评 软件测试公司 软件测试报告 跨浏览器测试 软件更新 行业资讯 软件测评机构 大数据测试 测试环境 网站优化 功能测试 APP测试 软件兼容测试 安全测评 第三方测试 测试工具 软件测试 验收测试 系统测试 测试外包 压力测试 测试平台 bug管理 性能测试 测试报告 测试框架 CNAS认可 CMA认证 自动化测试
专业测试,找专业团队,请联系我们!
咨询软件测试 400-607-0568