JMeter实用教程【二】-BeanShell的使用
为什么要使用BeanShell
之前在做客服域相关接口生产环境压测的时候,遇到一个问题,那就是签名如何生成,网关的同学是有提供相关签名计算的jar包,如何使用提供的jar包在JMeter中生成签名?BeanShell这个小工具可以帮到你。
BeanShell简介
Beanshell 是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,具有对象脚本语言特性。BeanShell执行 标准Java语句和表达式,另外包括一些脚本命令和语法。它将脚本化对象看作简单闭包方法(simple method closure)来支持,就如同在Perl和JavaScript中的一样。 它具有以下的一些特点:使用Java反射API以提供Java语句和表达式 的实时解释执行;可以透明地访问任何Java对象和API;可以在命令行模式、控制台模式、小程序模式和远程线程服务器模式等四种模式下面运行;
JMeter本身提供了对BeanShell的支持,目前在JMeter支持在以下几种组件中使用BeanShell
- 定时器 BeanShell Timer
- 前置处理器:BeanShell PreProcessor
- 采样器: BeanShell Sampler
- 后置处理器:BeanShell PostProcessor
- 断言: BeanShell断言
- 监听器: BeanShell Listener
使用BeanShell生成签名
在这里我们使用BeanShell Sampler来生成我们需要的签名,具体步骤如下:
- 第一步,创建一个java项目,引入maven-assembly-plugin
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.5.5</version>
<configuration>
<archive>
<manifest>
<mainClass>com.example.jmeter.Test</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
项目中request包主要存放要压测接口的请求类,直接拷贝项目中的xxxRequest到这里即可
SignUtils是签名工具类。
- 第二步生成jar包,执行以下maven命令,会生成一个包含依赖的jar文件。
mvn assembly:signle
- 第三步将生成的jar包导入到JMeter
打开JMeter点击测试计划,最底部 Add directory or jar to classpath,选择第一步打包好的jar文件即可。
- 第四步,使用BeanShell Sampler访问jar文件中的相关代码
import com.example.jmeter.util.SignUtils;
import com.example.jmeter.request.QuickReplyRequest;
String tip = vars.get("tip");
QuickReplyRequest request = new QuickReplyRequest();
request.setTip(tip);
String sign = SignUtils.getSign(request);
vars.put("sign", sign);
- 第五步,在HTTP Request Sampler中使用签名
/api/v1/h5/im-admin/quickReply/search/v2?sign=${sign}
至此你已经能够使用BeanShell解决生产环境签名生成问题了。当然还有更方便的方法,那就是网关提供签名接口,直接使用接口去生成签名就好了,如果网关同学没有提供相关接口,你还可以自己写个接口doge。
BeanShell常用内置变量
在前面的简单示例中我们使用了vars这个关键字来获取和设置JMeter中的变量,那么在BeanShell我们可以使用哪些内置变量来与JMeter进行交互呢?下面的表格列出了一些经常使用的变量。
变量 | 作用 | 示例 |
log | 写入信息到jmeber.log文件 | log.info("hello") |
ctx | 代表了当前线程的上下文 | ctx.getCurrentSampler() 获取当前Sampler ctx.getPreviousResult() 获取前一个Smapler的响应结果 更多使用参考:https://jmeter.apache.org/api/org/apache/jmeter/threads/JMeterContext.html
|
vars | JMeterVariables,操作JMeter变量,这个变量引用了JMeter线程中的局部变量容器(本质上是Map),它是测试用例与BeanShell交互的桥梁。 | vars.get(String key)从JMeter中获取变量 vars.pu(String key, String value)设置变量到JMeter局部变量容器中 |
props | JMeterProperties,操作JMeter属性,该变量引用了JMeter的配置信息,可以获取Jmeter的属性。它的使用方法与vars类似,但是只能put进去String类型的值,而不能是一个对象。对应于java.util.Properties。 | props.get(String key)获取属性值 props.put(String key, String value) 设置属性值 |
prev | 获取前面的Sample返回的信息 | prev.getResponseDataAsString()获取前一个Sample的响应信息。 pre.getResponseCode()获取响应code 更多使用参考 https://jmeter.apache.org/api/org/apache/jmeter/samplers/SampleResult.html |
至此我们对如何在JMeter中使用BeanShell有了初步的了解,也知道了在JMeter中有很多比较方便内置变量可以帮助我们实现复杂的逻辑和流程。