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 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.*


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM