JMeter BeanShell 断言动态校验 JSON 响应数据
BeanShell 断言应用场景
在接口自动化测试中,经常需要根据不同的请求参数对响应结果进行动态校验。例如,验证一个判断用户是否为新用户的接口。该接口返回的 JSON 数据结构如下:
{
"success": true,
"code": 0,
"msg": "success",
"data": {
"newUser": true,
"invitationCode": null
},
"total": 0
}
业务规则定义:当请求者为新注册用户时,newUser 字段返回 true;若为已存在的老用户,则返回 false。
动态断言脚本实现
假设测试数据集中包含两个手机号:15293561001(老用户)和 15293561002(新用户)。为了在 JMeter 中实现参数化驱动并动态校验返回的 newUser 值,可以在断言组件中添加 BeanShell 断言。
以下是重构后的 BeanShell 脚本。该脚本优化了变量获取方式,修复了字符串比较的潜在缺陷,并统一了断言逻辑:
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
// 设置响应编码并获取原始数据
prev.setDataEncoding("UTF-8");
String rawResponse = prev.getResponseDataAsString();
// 解析 JSON 响应体
JSONObject jsonPayload = JSON.parseObject(rawResponse);
JSONObject userData = jsonPayload.getJSONObject("data");
// 从 JMeter 变量中获取当前迭代的手机号
String phoneNumber = vars.get("mobile");
Boolean isNewUser = userData.getBoolean("newUser");
// 记录关键调试信息到 JMeter 日志
log.info("Current Phone: " + phoneNumber + " | Is New User: " + isNewUser);
// 定义预期状态
boolean expectedStatus;
if ("15293561001".equals(phoneNumber)) {
expectedStatus = false; // 老用户预期为 false
} else if ("15293561002".equals(phoneNumber)) {
expectedStatus = true; // 新用户预期为 true
} else {
Failure = true;
FailureMessage = "未匹配的测试手机号: " + phoneNumber;
return;
}
// 执行断言校验
if (isNewUser != null && isNewUser.booleanValue() == expectedStatus) {
Failure = false;
FailureMessage = "校验通过";
} else {
Failure = true;
FailureMessage = "校验失败: 预期 newUser=" + expectedStatus + ", 实际 newUser=" + isNewUser;
}
在 JMeter 中运行包含上述脚本的测试计划,查看"察看结果树"监听器。当请求参数分别为两个指定手机号时,断言均会顺利通过。若人为修改脚本中的预期值(例如将新用户的预期值改为 false),测试执行后,结果树中会清晰标记出断言失败,并输出 FailureMessage 中定义的错误详情及实际返回值。
核心断言变量解析
在 BeanShell 断言中,JMeter 预置了几个关键变量用于控制断言结果:
Failure:布尔类型变量。设置为false表示当前断言通过;设置为true则标记当前取样器请求失败。FailureMessage:字符串类型变量。当Failure为true时,用于在测试报告和日志中输出具体的失败原因或错误上下文信息。