最近學習使用了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,如“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.*