转载自: 黄小呱 http://www.jianshu.com/p/bc537d6acb3a
最近学习使用了jmeter来对接口进行测试。使用jmter进行接口测试,有时候需要编写一些BeanShell脚本语言,或者利用BeanShell调用自己的工具类,来完成jmeter基本功能中无法实现的功能,下面将对BeanShell Sampler及其相关使用作一个简要的介绍。
一、什么是BeanShell
BeanShell是一个小型嵌入式Java源代码解释器,具有对象脚本语言特性,能够动态地执行标准JAVA语法,并利用在JavaScript和Perl中常见的的松散类型、命令、闭包等通用脚本来对其进行拓展。BeanShell不仅仅可以通过运行其内部的脚本来处理Java应用程序,还可以在运行过程中动态执行你java应用程序执行java代码。因为BeanShell是用java写的,运行在同一个虚拟机的应用程序,因此可以自由地引用对象脚本并返回结果。
二.、BeanShell的特点
·完整的java语法的动态执行,java代码片段,以及松散类型的java和其他脚本。
·透明地访问所有java对象和API
·运行在四种模式:命令行,控制台,小程序,远程会话服务器。
·可以在安全约束的环境中工作
·编译器是一个小于150K的jar文件
三、BeanShell Sampler的使用
Jmeter中的BeanShell主要有:定时器BeanShell Timer、前置处理器BeanShell PreProcessor、采样器BeanShell Sampler、、后置处理器BeanShell PostProcessor、断言BeanShell、断言监听器BeanShell Listener。
下面以BeanShell Smapler为例介绍BeanShell的用法,其他的BeanShell使用方法可以用此举一反三。
(一)BeanShell Sampler创建
首先创建一个线程组
创建成功线程组后,在线程组中创建一个BeanShell Sampler。
创建成功的BeanShell Sampler如下图所示,创建成功之后可以在其中编写BeanShell脚本。
(二)获取时间戳
在Jmeter中,可以利用${__time(,)}时间戳函数来获取十位的时间戳:
此处不填入具体的访问地址,仅关注时间戳函数的使用。
使用${__time(yyyy-MM-dd-HH-mm-ss,)}可以获得yyyy-MM-dd-HH-mm-ss格式的十位的时间戳,结果如下图:
但是在具体使用中,有时候需要传送较为复杂的时间格式,如“2016-07-31T21:24:07.581Z”此时不能直接调用time函数,因此可以利用BeanShell获取当前时间。
此处运用了内置对象vars对变量进行存取操作:
·vars.get("name"):从jmeter中获得变量值
·vars.put("key","value"):数据存到jmeter变量中
若使用该程序段,在Jmeter中调用变量${str}可以获得yyyy-MM-ddTHH:mm:ss.SSSZ格式的时间,调用变量${str0}可以获得yyyy-MM-ddTHH:mm:ssZ格式的时间。
(三)BeanShell脚本使用的几种的不同的场景
以文件的读写为例,对BeanShell脚本的使用的几种不同的场景做了一个简单的总结
1. 自定义函数
在BeanShell中编写自定义函数,直接利用脚本编译器编译
程序段如下:
import java.io.BufferedReader;
import java.io.File;import java.io.FileReader;
import java.io.IOException;
import java.io.FileWriter;
import java.io.BufferedWriter;
File file = new File("D://apache-jmeter-2.13//Meclipper_case//Users_TestCase//email.txt");
BufferedReader reader = null;
String tempString = null;
String str;
int num;
String str3="";
String str2="";
try {
reader = new BufferedReader(new FileReader(file));
tempString = reader.readLine();//tempString读文件
reader.close();
str=tempString.trim();//str取字符串
if(tempString!=null&&!"".equals(str)){
for(int i=0;i=48 && str.charAt(i)<=57){
str2+=str.charAt(i);//str2取数字字符
}
}
//System.out.println(str2);
num=Integer.parseInt(str2);//num转换str2为int型
//System.out.println(num);
num=num+1;
//System.out.println(num);
str3= String.valueOf(num)+"@qq.com";//str3转换int型为string
//System.out.println(str3+"@qq.com");
}
}
catch (IOException e) {
e.printStackTrace();
}
finally {
if (reader != null) {
try {
reader.close();
}
catch (IOException e1) {
}
}
}
//String str4=str3+"@qq.com";
//System.out.println("str4="+str4);
try{
//File file = new File("/users/mkyong/filename.txt");
// if file doesnt exists, then create it
if (!file.exists()) {
file.createNewFile();
}
FileWriter fw = new FileWriter(file.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);
bw.write(str3);
bw.close();
}catch(IOException e){
e.printStackTrace();
}
vars.put("emailtxt",str3);
其中将读取出的文件中的内容,同时写入文件,并利用内置函数vars.put("emailtxt",str3);将内容赋予变量${emailtxt},在jmeter中就能够调用该变量。在该程序中,存了以数字命名的email,如“[email protected]”,利用读写文件,将email名+1,并使用该email进行注册。
在线程组中调用该变量:
Jmeter发送的email请求运行结果如下:
2. 调用外部java文件
如果我们已经有现成的java源文件,可以在BeanShell中直接编写和java引用外部文件时一样的语句来调用java外部文件。
还是之前读写文件的源程序,首先在eclipse中创建完整的工程,并在其中中编写相应的代码,需要注意的是引用的外部文件的返回值。
代码段如下所示:
其次,找到.java源文件的路径:
在BeanShell中引用该路径下的java源文件
3. 导入外部jar包
从上面两个场景可以知道,在BeanShell中引用外部文件和java是一样一样的,因此此处就不进行过多的描述,步骤为:
·在eclipse写好代码,然后把该类打成jar包(在类上点击右键->Export->jar file)
·把jar包放到jmeter目录\apache-jmeter-2.13\lib\ext下
·打开jmeter,添加一个http sampler,在sampler下添加一个BeanShell Sampler
·在BeanShell中的头文件中导入该jar包,例import testmail.src.hyq.utils.*