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中有很多比较方便内置变量可以帮助我们实现复杂的逻辑和流程。