一、什麼是BeanShell
BeanShell是由java編寫的,是一個輕量級的腳本語言,也相當於一個小巧免費的JAVA源碼解釋器,支持對象式的腳本語言特性,亦可嵌入到JAVA源代碼中,能動態執行JAVA源代碼併爲其擴展了腳本語言的一些特性。
二、JMeter中用BeanShell的好處
JMeter也是由java編寫的,而java運行時需要先編譯,然後纔可以運行,而BeanShell是一款解釋器,直接可能運行源代碼;
三、BeanShell在JMeter的作用
(1)對JMeter的功能的擴展;
(2)對jmeter變量的一些操作;
四、JMeter中BeanShell常用的基本語法:
1、log:打印日誌,寫入信息到jmeber.log文件;
2、SampleResult:獲取SampleResult對象,能通過這個對象獲取想要的信息;
3、Response:獲取Response對象,能通過這個對象獲取響應信息;
4、Failure:查看接口調使用能否成功,假如返回false是成功的,true是失敗的。
5、FailureMessage:失敗信息,沒有設置的時候失敗信息是空的,能set這個信息。
6、ResponseData:獲取response body類型是byte[]。
7、ResponseCode:返回接口code成功是200。
8、ResponseMessage:獲取msg成功是OK。
9、ResponseHeaders:獲取接口服務端返回的頭部信息。
10、RequestHeaders:獲取用戶端請求的頭部信息。
11、SampleLabel:獲取接口請求的名稱。
12、SamplerData:獲取請求的url和body。
13、ctx 當前線程的上下文信息,能直接用
14、vars即JMeterVariables,操作jmeter變量,這個變量實際引用了JMeter線程中的局部變量容器(本質上是Map),常用方法:
(1) vars.get("String key"):從jmeter中獲得變量值;
(2) vars.put("String key","String value"):將數據存到jmeter變量中;
15、prev 獲取sample返回的信息,常用方法:
(1) getResponseDataAsString():獲取響應信息。
(2) getResponseCode() :獲取響應code。
五、Jmeter中包含的BeanShell類型
1、BeanShell前置處理器:BeanSell PreProcessor
2、BeanShell取樣器:BeanSell Sampler
3、BeanShell後置處理器:BeanSell PostProcessor
4、BeanShell監聽器:BeanSell Listener
5、BeanShell定時器:BeanSell Timer
6、BeanShell斷言:BeanSell斷言
BeanShell前置處理器、BeanShell取樣器、BeanShell後置處理器,它們之間的區別:
1、BeanShell前置處理器、BeanShell後置處理器 比 BeanShell取樣器多一個重置解釋器(Reset Interpreter),意思是指:對於每一次處理是不是都要進行重置;
2、在JMeter中BeanShell取樣器是當成線程處理的,所以運行時是有一定的消耗的,而使用BeanShell前置處理器、BeanShell後置處理器總體來說比BeanShell取樣器消耗低,相當於少起一個線程。
六、JMeter中BeanShell使用
1、BeanSell取樣器中直接編寫代碼
(1)提取下圖中的https的鏈接地址
(2)首先用正則表達式提取器來提取值,這邊的正則表達式可以只提取一個值,也就是隻寫了一個()
(3)在BeanShell取樣器輸入輸入源碼,注意:這邊一定要寫參數${ABCDEF},這個值依賴於正則表達式提取數據,並且在代碼中一定要寫str = bsh.args[0],表示獲取數組參數,如果是取變量,用vars.get("String key")
public static void link(){
String IP;
String path;
String str;
str = bsh.args[0];
IP = str.substring(0,str.indexOf("/"));
path = str.substring(str.indexOf("/")+1);
vars.put("IP",IP);
vars.put("path",path);
}
link();
(4)Http2請求中服務器與路徑的數據依賴於BeanShell取樣器中所獲取的IP、path的值
(5)運行後,在察看結果樹中,可以看到獲取到了IP與path的值
(6)察看結果樹中顯示Http2請求數據正確
2、引用外部的java源碼
(1)java源碼,右鍵--Properties,查看java源碼的存放路徑
public class BeanShell {
public static String[] beanShellMethod(String str){
String[] arr = new String[2];
//截取/前的字符串
arr[0] = str.substring(0,str.indexOf("/"));
//截取/後的字符串
arr[1] = str.substring(str.indexOf("/")+1);
return arr;
}
}
(2)BeanShell取樣器中要引入java源碼的存放路徑,source("E:/jmeterMethod/BeanShell.java");
source("E:/jmeterMethod/BeanShell.java");
String str = bsh.args[0];
BeanShell method = new BeanShell();
String[] array = method.beanShellMethod(str);
for(int i=0;i<array.length-1;i++) {
String IP = array[i];
String path = array[i+1];
vars.put("IP",IP);
vars.put("path",path);
}
(3)Http2請求中服務器與路徑的數據依賴於BeanShell取樣器中所獲取的IP、path的值
(4)運行後,在察看結果樹中,可以看到獲取到了IP與path的值
3、引入外部class文件
(1)DOS中將源碼編譯成class文件
(2)BeanShell取樣器,引入class文件用addClassPath("相對路徑或絕對路徑"),還需用import導入,格式爲: import 包名.類名,注意:包名一定要寫上。
注意:addClassPath()是找指定的路徑,source()是找指定的文件
addClassPath("F:\\java\\j\\p\\src");
import com.jyh.BeanShell;
String str = bsh.args[0];
BeanShell method = new BeanShell();
String[] array = method.beanShellMethod(str);
for(int i=0;i<array.length-1;i++) {
String IP = array[i];
String path = array[i+1];
vars.put("IP",IP);
vars.put("path",path);
}
(3)運行後,在察看結果樹中,可以看到獲取到了IP與path的值
4、引入外部jar包
(1)將jar包複製到jmeter\lib\ext路徑下,這個lib\ext路徑下存放引入外部的一些jar包
(2)BeanShell取樣器,注意一定要用import導入包
import com.jyh.BeanShell;
String str = bsh.args[0];
BeanShell method = new BeanShell();
String[] array = method.beanShellMethod(str);
for(int i=0;i<array.length-1;i++) {
String IP = array[i];
String path = array[i+1];
vars.put("IP",IP);
vars.put("path",path);
}
(3)運行後,在察看結果樹中,可以看到獲取到了IP與path的值