Jmeter-BeanShell的使用介绍

最近学习使用了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 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 

} 

} 

  

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,如“110@qq.com”,利用读写文件,将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.* 

posted @ 2017-11-28 13:34  春田花花同学会  阅读(530)  评论(0编辑  收藏  举报