jmeter學習記錄--05--Beanshell2

學習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);
View Code

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});//直接獲取不生效,日誌打印爲空 
View Code

若使用該程序段,在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();
View Code

 

 

 

 

問題列表

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});
beanshell變量定義

 

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;
beanshell使用變量

 

{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

 
 
Q2:hashmap這類的,一樣的腳本在ecplise裏運行正常,在beanshell中報錯 (jmeter3.3 測試時)
最終的緣由爲Map方法中不能指定數據類型,List中同理。
 

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

 

 

 

 

 
 
 
 
 
 
 待續。。。。。。。。。。。。。。。
相關文章
相關標籤/搜索