超实用 JMeter BeanShell Sampler 教程
宝子们,今天咱继续深挖 JMeter 里超厉害的 BeanShell Sampler,这次多来点实际工作中的例子,让你彻底搞懂它!
一、这是个啥玩意儿?
BeanShell Sampler 就像是 JMeter 的一个秘密武器,能让你用 Java 代码给测试计划 “开外挂”。当 JMeter 自带的功能没法满足那些奇奇怪怪的测试需求时,它就派上用场了。把它想象成一个万能的工具箱,你可以在里面自由发挥,编写代码让 JMeter 变得超级智能。
二、咋把它弄出来用呢?
在 JMeter 里找到你的线程组,然后右键点它,依次选 “添加”“取样器”“BeanShell Sampler”,这样它就出现在你的测试计划里啦。接着呢,在它的 “Script” 那块地方,就可以开始施展你的编程魔法了。
三、那些好用的内置宝贝
- log 小助手:这可是你的测试贴心小秘书。
log.info("宝子们,这里一切正常哦!")
能把测试过程中的重要信息记录下来,比如某个步骤顺利完成啦。要是遇到问题,log.error("哎呀,出错啦!")
会马上把错误详情记好,方便你追踪问题根源。像你测试一个文件上传功能,成功上传后就log.info("文件上传成功,撒花!")
,要是上传失败,log.error("文件上传失败,原因可能是……")
,后面详细写上你猜测的原因,这样排查问题就容易多了。 - vars 神奇口袋:用来存放各种测试要用的变量。
vars.get("用户名")
就像是从口袋里掏出之前放进去的用户名。要是你想更新或新增变量,就用vars.put("新变量名", "变量的值")
。比如说,你从数据库里查询到一个用户的积分是 100,就可以vars.put("用户积分", "100")
,后续测试中涉及到积分相关的操作就能直接用这个变量了。 - prev 时光机:能让你看到之前发生的请求情况。
prev.getResponseDataAsString()
就像是穿越回上一个请求,把那个请求的回复内容拿过来看个究竟。prev.getResponseCode()
呢,就是查看上一个请求的状态码,是成功的 200,还是出错的 404 之类的。例如,你刚发了一个查询用户信息的请求,用prev.getResponseDataAsString()
就能检查返回的用户信息是不是完整准确,如果返回的是乱码或者数据缺失,那就得找找问题了。 - Failure 和 FailureMessage 小警钟:当测试出现状况时,把
Failure
设为true
,就相当于拉响了警报。然后FailureMessage
就是在警报响起时,详细说明哪里出问题了。比如你在验证一个支付接口,结果支付成功的提示没出现,你就可以Failure = true; FailureMessage = "支付成功提示未显示,可能支付流程有问题哦!"
四、实际工作中的应用场景
- 电商系统中的价格计算与验证
- 在电商平台的测试中,商品价格会根据不同的促销活动、用户等级、优惠券等因素而变化。假设我们有一个测试场景,要验证不同等级的用户在使用特定优惠券购买特定商品时,最终支付价格是否正确。
- 首先,通过其他组件(如 CSV Data Set Config)获取用户等级、商品原价、优惠券金额等数据。然后在 BeanShell Sampler 中,根据这些数据进行价格计算。例如:
// 获取用户等级
String userLevel = vars.get("userLevel");
// 获取商品原价
double originalPrice = Double.parseDouble(vars.get("originalPrice"));
// 获取优惠券金额
double couponAmount = Double.parseDouble(vars.get("couponAmount"));
double finalPrice = 0.0;
if ("vip".equals(userLevel)) {
// VIP 用户享受额外 8 折优惠
finalPrice = (originalPrice - couponAmount) * 0.8;
} else {
finalPrice = originalPrice - couponAmount;
}
// 将计算出的最终价格设置为变量,供后续请求使用
vars.put("finalPrice", Double.toString(finalPrice));
// 发送购买请求后,检查响应中的实际支付价格是否与计算出的最终价格一致
String responseData = prev.getResponseDataAsString();
if (responseData.contains("实际支付价格:" + finalPrice)) {
log.info("价格验证成功!");
} else {
Failure = true;
FailureMessage = "价格验证失败,实际支付价格与预期不符!";
log.error(FailureMessage);
}
- 金融系统中的风险评估与交易限制
- 在金融交易系统测试中,需要根据用户的信用评级、交易历史、账户余额等因素来评估风险,并对某些高风险交易进行限制或提示。例如,当用户的信用评级较低且交易金额超过其账户余额一定比例时,拒绝交易并返回相应提示。
// 获取用户信用评级
String creditRating = vars.get("creditRating");
// 获取账户余额
double accountBalance = Double.parseDouble(vars.get("accountBalance"));
// 获取交易金额
double transactionAmount = Double.parseDouble(vars.get("transactionAmount"));
if ("low".equals(creditRating) && transactionAmount > accountBalance * 0.8) {
// 拒绝交易,设置响应信息
vars.put("responseMessage", "交易被拒绝,由于信用评级低且交易金额过高。");
Failure = true;
FailureMessage = "高风险交易被拒绝,符合风险控制规则。";
log.error(FailureMessage);
} else {
// 交易正常,可继续进行其他操作
log.info("交易风险评估通过,可继续执行。");
}
- 社交平台中的动态发布与权限验证
- 在社交平台测试中,用户发布动态时,需要根据其账号状态(是否被封禁、是否实名认证等)以及动态内容是否符合平台规定(如是否包含敏感词)来决定动态是否能够成功发布。假设我们通过一个文本文件提供了敏感词列表,在 BeanShell Sampler 中检查动态内容是否包含敏感词。
// 获取用户动态内容
String postContent = vars.get("postContent");
// 假设从文件中读取敏感词列表并存储为数组(这里简化处理,实际可能需要更复杂的读取逻辑)
String[] sensitiveWords = {"敏感词 1", "敏感词 2", "敏感词 3"};
for (String word : sensitiveWords) {
if (postContent.contains(word)) {
// 动态包含敏感词,设置提示信息并阻止发布
vars.put("errorMessage", "动态包含敏感词,发布失败。");
Failure = true;
FailureMessage = "动态发布因敏感词被拦截。";
log.error(FailureMessage);
break;
}
}
if (!Failure) {
log.info("动态内容合规,可继续发布流程。");
}
五、咋调试它呢?
- 日志输出:就像我们前面说的
log.info
和log.error
,你可以在代码里到处写上这些,把变量的值、执行到哪一步了这些信息都记下来。这样就像你在测试的路上放了很多小标记,要是出问题了,顺着标记就能找到问题在哪。比如在计算价格的代码里,你可以在每个计算步骤后加上log.info("当前计算结果:" + 当前计算结果变量);
,这样就能清楚地看到价格是怎么一步步算出来的。 - 启用调试模式:在代码里写上
debug();
就像是给 JMeter 戴上了一个超级放大镜,它会把代码执行的每一个小细节都告诉你。不过这个放大镜太厉害,会让测试变慢,所以一般只有在你特别想知道代码到底咋跑的时候才用。 - 单步执行和变量值查看:用
debug("当前变量的值是:" + 变量名);
这样的代码,就像是你在代码执行的时候,让它停一下,看看某个变量现在是啥情况。比如说你在验证社交平台动态发布的代码里,在检查敏感词的循环中,加上debug("当前检查的敏感词:" + word);
,就能清楚地看到每个敏感词的检查情况。
宝子们,BeanShell Sampler 的潜力可大着呢!多在实际工作中用用这些例子,再根据自己的测试需求灵活修改代码,你就能轻松应对各种复杂的测试场景,让你的 JMeter 测试技能更上一层楼!
标签:log,vars,FailureMessage,BeanShell,测试,Sampler,JMeter From: https://www.cnblogs.com/geekzone/p/18628802