05_jmeter之BeanShell PreProcessor
2018-07-15 本文已影响315人
王康健_0124
前置处理器:BeanShell PreProcessor
前置处理器: 在请求发送之前执行BeanShell PreProcessor

BeanShell PreProcessor :可以实现一些比较难处理的数据,在请求报文发送之前进行处理
-
在说beanshell之前先谈一下这段时间对jmeter的理解
jmeter 的中所有的数据的存储玩的就是一首HashMap,“用户自定义变量”、“CSV 数据文件设置”、“JDBC Request” 所有用到变量的地方,都是以键值对的形式进行存储的,而且是不确定存储数量,这正好符合的HashMap的特性,且beanshell中存取变量用的就是HashMap的get和put方法!
beanshell的使用
1. 直接取数据,使用第三方jar包进行数据处理
实例:调用第三方MD5jar包,对密码进行加密操作
① 先在“jmeter中的http请求下”创建一个前置处理器--beanShell PreProcessor
② 指定要用的jar包的位置:测试计划-->浏览-->需要使用的jar包

③ 选择要使用的jar包中的类:右键jar包-->用WinRAR打开-->一层一层的打开文件夹-->把com\guoyasoft\tool写入到beanshell中-->指定类名(这里的操作就是java中使用别的类的写法)




④ 写处理代码
- 在用户自定义变量中设置一个password变量,然后给初始化一个值
- 因为Jmeter的变量池就是一个HashMap,所以我们可以根据HashMap中的key找到对应的数据,写法
vars.get("key")
vars是jmeter的HashMap变量池的名称!.get()
方法,获取到key=“password”的value值 - 把约定的key和用户自定义中的password的值
(vars.get("password")
获取)进行一个拼接,然后调用MD5()的方法,返回加密后的字符串 - 把加密后的字符串用HashMap的存方法,put()方法,更新变量池中password的value值,从而达到请求时,发送的密码是加密效果
实际代码如下:
import com.guoyasoft.tool.MD5Tool;
log.info("----------------------password="+vars.get("password"));
//这里直接一个打印输出作用,可以不用写
String password=MD5Tool.MD5(vars.get("password")+"&key=guoyasoft");
// MD5Tool类里有个MD5的方法,首先vars.get获取用户自定义变量中的password变量的值
// 然后加上代码中定义的key ,生成的结果存到一个String类型的变量中
// BeanShell玩的是HashMap,存的是一对对的键值对格式的数据,
// 存数据的方法是,vars.put("HashMap的key",加密的变量名字)
vars.put("password",password);
实际效果如下:做了两次日志打印,第一次没有加密,第二次进行了加密处理

2 直接使用JDK自带的类
因为jmeter也是java写的应用程序,也需要用到jdk环境变量,所以它也可以使用jdk自带的一下jar包
例如:获取系统当前时间,和昨天时间(建议在一个开发工具中写好,然后在拷到jmeter中)


package com.yiguo.business;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import org.testng.annotations.Test;
public class TestAuto {
@Test
public void startTime() {
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
// 首先需要new一个SimpleDateFormat 确定时间的格式
Calendar c = Calendar.getInstance();
// Calendar 使用默认时区和区域设置获取日历。返回的日历是基于默认时间带默认区域的当前时间。
// 存到Calendar类型的变量中
String starttime = sf.format(c.getTime());
// 对象Calendar类型的变量c下面的方法getTime()方法,获取到时间
// 然后使用new出来的SimpleDateFormat类型的对象下的format()方法把获取的时间格式转换为字符串类型
c.add(Calendar.DAY_OF_MONTH, 1);
// Calendar:获取当前时间 DAY_OF_MONTH:更改日 ,1:增加一天
// 把Calendar类型的变量c, 重新赋值
String endTime = sf.format(c.getTime());
System.out.println("starttime="+starttime+"\r\nendTime="+endTime);
}
}

- 使用打印日志方法,查看是否使用成功
