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獲取變數:xiaojianjian123
log.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: xiaojianjian002
name = props.get("name1");
log.info(name+"002");

 通過使用假介面來將腳本簡化

安裝JMETER插件Dummy Sampler

 

 

 

有了這個模擬器後,就可以根據它代替很多真實介面

那我們有了介面同樣可以通過BeanShell去獲取它的請求和響應

在介面下添加一個BeanShell後置處理器(以上面Dummy的取樣器為例子)

// print request data
log.info(prev.getSamplerData()); // //www.123321.com
// print response data
log.info(prev.getResponseDataAsString()); // {"data":1}
// print response code
log.info(prev.getResponseCode()); //200

 條件判斷

與其他語言類似

1)比較相等用equals、==、!=

2)比較大小用>、<、>=、<=

3) 包含關係contains

// 判斷狀態碼是否為200
resCode = 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

// 創建一個list
List list1 = new ArrayList();
// 添加元素:add
list1.add("first");
// 在指定位置插入元素
list1.add(0,"l am the first");
log.info("添加後"+list1); // 添加後[l am the first, first]

除了使用add我們還可以使用addAll的方法

// 創建一個list2
List 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取值

//for循環取值
for(int i=0 ; i < list3.size();i++){
    log.info(list3.get(i).toString());
}

 友情鏈接:

//www.cnblogs.com/yetangjian/p/16818697.html