JMETER與BeanShell

變量Beanshell應用自定義變量有兩種方法:
#第一種方法 , 使用${key}格式,但是需要注意這是用應用的變量是沒有定義數據類型的#log.info(String Key)只能打印字符串,所以按下述寫法會報錯name = ${name};log.info(name);#需要改成name1 = "${name}";log.info(name1);#第二種使用vars.get(String key),這里需要注意應用的變量需要加上引號name3 = vars.get("name"); 把變量A賦值給變量B
#這時候+號拼接完就是字符串了int a = 123;b = "abc" + a;log.info(b);#注意put賦值給的變量需要加上引號vars.put(String key,String value)vars.put("c",b);log.info(vars.get("c")); 區別:
${key}引用的都是最開始設置的自定義變量 。vars.get會獲取最新變量
name = "${name}";vars.put("name",name + 123);log.info("vars.get獲取變量:" + vars.get("name")); // vars.get獲取變量:xiaojianjian123log.info("${}獲取變量:" + "${name}") // ${}獲取變量:xiaojianjian實例:
我們現在有一個自定義變量設置在線程組里 , cnt初始值為0,循環10次 , 每次循環我們需要讓cnt+1
cnt = "${cnt}";nextCnt = Integer.parseInt(cnt) +1;log.info("第一種整型轉字符串:" + nextCnt.toString());//log.info("第二種整型轉字符串:" + String.valueOf(nextCnt));vars.put("cnt",nextCnt.toString())這里我們需要將字符串先轉數字,再將數字轉回字符串
這里要特別注意:
寫BeanShell的時候不要使用Debug sampler,因為Debug sampler會再次調用一次BeanShell造成錯誤多次計算,正式運行的時候記得禁用Debug sampler
跨線程取值A線程擁有一個用戶自定義變量,這是B線程使用vars.get同樣可以取到值,但是如果實在A線程的BeanShell中設置的變量用vars就取不到了
//BeanShellTestElement: null002 取上一個線程的BeanShell變量name = vars.get("name");log.info(name+"002");//BeanShellTestElement: xiaojianjian001002 取上一個線程的用戶自定義變量name = vars.get("name");log.info(name+"002");那如果要取上一個線程的BeanShell變量就需要用props
//A線程name = "xiaojianjian";props.put("name1",name);//B線程 BeanShellTestElement: xiaojianjian002name = props.get("name1");log.info(name+"002"); 通過使用假接口來將腳本簡化安裝JMETER插件Dummy Sampler

JMETER與BeanShell

文章插圖
【JMETER與BeanShell】
JMETER與BeanShell

文章插圖
有了這個模擬器后,就可以根據它代替很多真實接口
那我們有了接口同樣可以通過BeanShell去獲取它的請求和響應
在接口下添加一個BeanShell后置處理器(以上面Dummy的取樣器為例子)
// print request datalog.info(prev.getSamplerData()); // https://www.123321.com// print response datalog.info(prev.getResponseDataAsString()); // {"data":1}// print response codelog.info(prev.getResponseCode()); //200條件判斷與其他語言類似
1)比較相等用equals、==、!=
2)比較大小用>、<、>=、<=
3) 包含關系contains
// 判斷狀態碼是否為200resCode = prev.getResponseCode();log.info("響應碼:"+resCode);if (resCode.equals("200")){log.info("請求成功");}else{log.info("請求失敗");}// age1是之前的接口提取出來的變量age = vars.get("age1");log.info(age);if (Integer.parseInt(age) > 14){log.info("已經不是小孩子:"+age);}else{log.info("年齡小于14" + age);}age = vars.get("age1");if (!age.contains("1")){log.info("不包括1");}else{log.info("包括1");}對list的相關操作// 對于list的操作import java.util.List;import java.util.ArrayList; 創建一個list
// 創建一個listList list1 = new ArrayList();// 添加元素:addlist1.add("first");// 在指定位置插入元素list1.add(0,"l am the first");log.info("添加后"+list1); // 添加后[l am the first, first]除了使用add我們還可以使用addAll的方法
// 創建一個list2List list2 = new ArrayList();// 把list1所有的元素添加到list2中,成功同時返回True , 失敗返回False,addAll(index,list);Boolean isAdd = list2.addAll(0,list1);log.info("是否加入成功:"+ isAdd + " 加入后的list2"+list2); //是否加入成功:true 加入后的list2[l am the first, first] 根據索引找值,根據值返回第一個匹配到索引
// 獲取list中的值value1 = list2.get(0);log.info(value1); // l am the first// 獲取list中值對應的第一個索引List list3 = new ArrayList();list3.add(1);list3.add(2);list3.add(1);log.info(list3.indexOf(1).toString()); // 0返回list的長度
//返回list長度log.info(list3.size().toString()); // 3循環list取值

推薦閱讀