浅谈重要组件Beanshell
BeanShell是JMeter中一个非常实用的组件,它允许用户通过Java-like的脚本语言执行自定义逻辑,从而极大地扩展了JMeter的功能。本文将详细介绍BeanShell的使用方法、常见用途、以及其在JMeter中的具体应用场景。
BeanShell概述
BeanShell是一种轻量级的Java脚本解释器,它支持即席(adhoc)的脚本编写和快速原型开发。在JMeter中,BeanShell可以用于创建动态且高度定制化的测试计划组件,如采样器、前置处理器、后置处理器、断言、计时器和监听器。相比于JMeter的图形界面操作,BeanShell提供了更高的灵活性和编程控制能力。
BeanShell的组件及用途
- BeanShell Sampler(取样器)
● 用途:执行自定义的Java代码片段,可以用来发送请求、处理响应或执行任何复杂的业务逻辑。
● 示例:模拟复杂请求、动态生成请求参数。 - BeanShell PreProcessor(前置处理器)
● 用途:在主采样器执行前运行,常用于数据预处理,如修改请求参数、设置变量等。
● 示例:根据某些条件动态计算变量值。 - BeanShell PostProcessor(后置处理器)
● 用途:在采样器执行后运行,用于解析响应数据,提取有用信息存储为变量。
● 示例:从HTML或JSON响应中提取数据。 - BeanShell Assertion(断言)
● 用途:提供更灵活的验证机制,通过脚本判断响应是否符合预期。
● 示例:对比响应数据与预期值的复杂逻辑验证。 - BeanShell Timer(定时器)
● 用途:基于条件控制请求间的延迟时间,提供更灵活的定时控制。
● 示例:根据服务器响应时间动态调整下一个请求的等待时间。 - BeanShell Listener(监听器)
● 用途:监听并处理测试结果,可用于日志记录、数据分析等。
● 示例:收集测试期间的特定数据,输出至文件或控制台。
应用实例
在BeanShell组件中,以下是一些常用的内置变量,它们可以帮助你访问JMeter上下文中的信息,首先使用SpringBoot编写一个接口,部分代码如下
@PostMapping(value = "/login",produces = "application/json;charset=UTF-8")
public String authenticate(@RequestBody JSONObject request) {
String validUsername = "admin";
String validPassword = "password";
if (request.getString("username").equals(validUsername) && request.getString("password").equals(validPassword)) {
return "认证成功";
} else {
return "认证失败";
}
}
log关键字
作用:打印日志信息,如 log.info(“This is an info message.”);
编写如下脚本:
线程组:保持默认
BeanShell 取样器:编写如下脚本
log.info("This is an info message.");
log.warn("This is an warn message.");
log.error("This is an error message.");
运行脚本,查看日志信息:
2024-07-08 16:05:21,685 INFO o.a.j.u.BeanShellTestElement: This is an info message.
2024-07-08 16:05:21,685 WARN o.a.j.u.BeanShellTestElement: This is an warn message.
2024-07-08 16:05:21,685 ERROR o.a.j.u.BeanShellTestElement: This is an error message.
var关键字
作用:操作JMeter局部变量,例如设置变量 vars.put(“myVar”, “value”); 或获取变量 vars.get(“myVar”);
编写如下脚本:
线程组:保持默认
BeanShell 取样器1:编写如下脚本
String s = "test";
vars.put("val",s);
String value = vars.get("val");
log.info("value变量的值为:" + value);
BeanShell 取样器2:编写如下脚本
log.info("val变量的值为:${val}");
运行脚本,查看日志信息:
2024-07-08 16:31:28,626 INFO o.a.j.u.BeanShellTestElement: value变量的值为:test
2024-07-08 16:31:28,641 INFO o.a.j.u.BeanShellTestElement: val变量的值为:test
props关键字
作用:操作JMeter全局属性,如设置属性 props.put(“PROP_NAME”, “value”); 或读取属性 props.get(“PROP_NAME”);
测试脚本沿用log关键字的脚本,并且将BeanShell 取样器中的内容代码替换如下
props.put("PROP_NAME", "value");
String value = props.get("PROP_NAME");
log.info("PROP_NAME变量的值为:" + value);
运行脚本,查看日志信息:
2024-07-08 16:33:25,939 INFO o.a.j.u.BeanShellTestElement: PROP_NAME变量的值为:value
prev关键字
作用:访问前一个采样器的响应数据等,如获取响应文本 prev.getResponseDataAsString();
编写脚本如下:
线程组:保持默认
HTTP信息头管理器:添加信息头,名称:content-type,值:application/json;charset=UTF-8
HTTP请求:协议http,服务器名称或IP为127.0.0.1,端口号为8091,请求方法post,路径/login,内容编号utf-8,消息体数据如下:
{