學習beanshell時有很多的例子、遇到很多問題。在此記錄下。html
A1:使用Beanshell請求做爲測試請求java
一個打包的Jar包,直接對其內的方法進行測試。shell
第一步:將接口jar包要放到%JMETER_HOME%\lib目錄apache
第二步:編寫請求。api
A2:共享線程變量dom
JMeter中線程間共享變量能夠經過定義屬性值來完成,JMeter啓動時會讀取一些屬性文件,好比jmeter.properties、user.properties,這些屬性值是能夠增長的,也能夠修改的,經過BeanShell能夠對其進行更改。ide
定義變量:以BeanShell Sampler爲例,在其中經過props.put()來增長屬性,props.get()來獲取屬性。如:props.put("param_a","root");函數
使用變量:在後續請求如Java請求中經過 ${__property(【屬性名稱】,,)}來獲取。如:${__property(param_a,,)} 來使用。post
示例:學習
在線程組1中使用__setProperty定義屬性值(全局變量),將所需變量值${param_A}設置爲屬性值。
String token = bsh.args[0];//輸入值爲assfd //第一種寫法,測試時token與${token}兩種寫法都沒法調用變量 ${__setProperty(param_A,${token},)}; //第二種寫法 props.put("param_B",token);
debug請求中,打開屬性與變量。查看結果樹中,屬性值結果爲:
param_A=${token}
param_B=assfd
在線程組2,beanshell中輸入
${__property(param_A,GROUP2_A,)};
${__property(param_B,GROUP2_B,)};
debug請求中,打開屬性與變量。查看結果樹中,變量值結果爲:
GROUP2_A=${token}
GROUP2_B=assfd
疑問:1)${__setProperty(param_A,token,)}; 這裏token是變量,可是實際是將這個字符串拷貝存到param_A屬性裏的了。換成${token}也是如此。
2)props.put添加的屬性值,不會寫到jmeter.properties文件裏,只在當前測試計劃中生效。好比當前加了一個屬性A,執行事後在當前測試計劃中會一直存在,即便beanshell文件中已無這個屬性值的定義也是如此。從新打開一個測試計劃,屬性A就不存在了。
A3:使用 BeanShell 斷言判斷用例成功與否
用beanshell作斷言結果判斷
log.info(SampleResult.getResponseDataAsString()); boolean result = false; String uid = vars.get("uid"); String token = vars.get("token"); if (SampleResult.getResponseCode().equals("200") && token.contains(uid)) { result = true; } else { result = false; } SampleResult.setSuccessful(result);
http://www.cnblogs.com/xxyBlogs/p/5966194.html
A4:處理請求或結果,如對base64加解密,URL轉碼等(jmeter 3.2)
base64加解密,使用函數助手中的兩個函數。
在beanshell中添加
//加密,encode爲加密後字符串變量 ${__base64Encode(「haishizi」,encode)}; //解密,對加密胡變量作解密處理 ${__base64Decode(${encode},decode)};
debug sampler對應測試結果爲:
decode="haishizi"
encode=ImhhaXNoaXppIg==
若是加密函數中${__base64Encode(「haishizi」,encode)};修改成${__base64Encode(haishizi,encode)};
對應測試結果爲:
decode=haishizi
encode=aGFpc2hpemk=
A5:自定義時間格式 Jmeter-BeanShell的使用介紹
普通方式獲取時間戳
在Jmeter中,能夠利用${__time(,)}時間戳函數來獲取十位的時間戳:
{
"time":"${__time(yyyy-MM-dd-HH-mm-ss,)}"
}
直接執行後,在「查看結果樹」中顯示的是:
BeanShell自定義
可是在具體使用中,有時候須要傳送較爲複雜的時間格式,如「2016-07-31T21:24:07.581Z」此時不能直接調用time函數,所以能夠利用BeanShell獲取當前時間。
import java.util.*; import java.text.SimpleDateFormat; String str1 = (new SimpleDateFormat("yyyy-MM-dd")).format(new Date()); String str2 = (new SimpleDateFormat("HH:mm:ss.SSS")).format(new Date()); String str3 = (new SimpleDateFormat("HH:mm:ss")).format(new Date()); vars.put("str_A",str1+"T"+str2+"2"); vars.put("str_B",str1+"T"+str3+".000"+"2"); log.info("\n"+str_A);//直接獲取不生效,日誌打印爲void log.info("\n"+${str_A});//直接獲取不生效,日誌打印爲空
若使用該程序段,在Jmeter中調用變量${str_A}能夠得到yyyy-MM-ddTHH:mm:ss.SSSZ格式的時間,調用變量${str_B}能夠得到yyyy-MM-ddTHH:mm:ssZ格式的時間。
http請求中輸入,選擇post方法。
{ "time":"${__time(yyyy-MM-dd-HH-mm-ss,)}" "time2":${str_A} "time3":${str_B} "time4":${str1} }
查看結果樹中結果爲:
POST data:
{
"time":"2017-07-26-18-23-56"
"time2":2017-07-26T18:23:56.8692
"time3":2017-07-26T18:23:56.0002
"time4":${str1}
}
疑問:爲什麼str1字符串直接日誌輸出或使用變量不能夠,將其轉化爲內置變量就可正常使用?
A6:把測試結果放到一個excel文件中
FileWriter fstream = new FileWriter("d:\\a.csv",true); BufferedWriter out = new BufferedWriter(fstream); out.write("uid"+","+vars.get("uid")+","); out.write("mobileNumber"+","+vars.get("mobileNumber")+","); out.write("inviteCode"+","+vars.get("inviteCode")+","); out.write("\n"); //out.write(vars.get("inviteCode")); //out.write(System.getProperty("line.separator")); out.close(); fstream.close();
Q1:自定義函數的變量賦值時報錯(jmeter 3.2)---未解決
變量定義有3種狀況:
第一種:param_A,直接經過vars.put來定義參數值;
第二種:param_B,經過bsh.args[0]獲取到傳入的參數值123,將其賦值。
第三種:經過函數變量來實現,將字符串abc變量的值賦值給unique_id。
import java.util.UUID; vars.put("param_A","123456"); vars.put("param_B",bsh.args[0]); UUID uuid1 = UUID.randomUUID(); String abc = uuid1.toString(); vars.put("unique_id",abc); log.info("\n_abc_value:"+abc); log.info("\n unique_id value:"+${unique_id});
result = "\n"+"param_A:"+bsh.args[0]+"\n"; //1:從參數框中獲取參數變量,不適用 result += "param_B:"+bsh.args[1]+"\n"; result += "unique_id:"+bsh.args[2]+"\n"; ResponseCode = 500;//回寫請求響應代碼,借鑑的http響應碼 ResponseMessage = "test ok!!";//回寫響應信息 IsSuccess = true;//回寫響應結果 log.info("\nlog test:"+result);//調用jmeter內置log對象,日誌會打印到jmeter.log中 SampleResult.setResponseData("SampleResult:"+result+"\n");//回寫響應數據,SampleResult爲jmeter內置回寫結果對象,有不少可用方法,能夠參看源碼 return "return:"+result;
{unique_id}值並未取實際的參數值。看log日誌:
2017-07-12 09:00:53,939 ERROR o.a.j.u.BeanShellInterpreter: Error invoking bsh method: eval Sourced file: inline evaluation of: ``import java.util.UUID; vars.put("param_A","123456"); vars.put("param_B",bsh.arg . . . '' : Attempt to access property on undefined variable or class name
可看到abc字符串取值仍是正常的,可是將其賦值unique_id後報錯。
vars:即JMeterVariables,操做jmeter變量,這個變量實際引用了JMeter線程中的局部變量容器(本質上是Map),經常使用方法:
a) vars.get(String key):從jmeter中得到變量值
b) vars.put(String key,String value):只能用String類型的參數,數據存到jmeter變量中,其做用可簡單理解爲賦值操做:key=value,更多方法可參考:org.apache.jmeter.threads.JMeterVariables
Map<String, String> paramMap = new HashMap<String, String>();
其中有這行代碼時總會提示:
2019-01-30 16:04:54,702 ERROR o.a.j.u.BeanShellInterpreter: Error invoking bsh method: eval In file: inline evaluation of: ``import org.apache.commons.codec.digest.DigestUtils; //導入md5加密的包 import java. . . . '' Encountered "," at line 12, column 11.
2019-01-30 16:04:54,702 WARN o.a.j.p.j.s.BeanShellSampler: Exception executing script. org.apache.jorphan.util.JMeterException: Error invoking bsh method: eval In file: inline evaluation of: ``import org.apache.commons.codec.digest.DigestUtils; //導入md5加密的包 import java. . . . '' Encountered "," at line 12, column 11.
將這行修改成:Map paramMap = new HashMap(); 後解決
後續用put方法將信息存到paramMap中。可是若是引入的jar中有代碼也是使用的map傳參,而beanshell中若是調用這個方法時也會報錯。
beanshell調用:
String sign = MD5Util.proSign(paramMap,secret);
jar包中源碼: public String proSign(Map<String, String> params, String secret)
報錯: 2019-01-30 16:38:53,914 ERROR o.a.j.u.BeanShellInterpreter: Error invoking bsh method: eval Sourced file: inline evaluation of: ``import com.chain.*; import java.util.Map; import java.util.HashMap; import java . . . '' : Typed variable declaration : Cannot reach instance method: proSign( java.util.Map, java.lang.String ) from static context: com.test.MD5Util 2019-01-30 16:38:53,914 WARN o.a.j.p.j.s.BeanShellSampler: Exception executing script. org.apache.jorphan.util.JMeterException: Error invoking bsh method: eval Sourced file: inline evaluation of: ``import com.test.*; '' : Typed variable declaration : Cannot reach instance method: proSign( java.util.Map, java.lang.String ) from static context: com.test.MD5Util
這種調用方式,沒有解決。用其餘方式暫時規避了。
參考:
http://www.javashuo.com/article/p-eotuahqc-ka.html
https://blog.csdn.net/qq_35304570/article/details/80858494