全局变量设置与调用
1、__setProperty
- 功能:该函数用来给JMeter属性设置值,默认返回值为空字符串,所以函数在任何地方被调用都是有效的。
- 作用域:跨线程组调用,可以在任意地方调用,但不能跟在import xxx后面。
- 用法:${__setProperty(property name, property value, True/False)}
(1)Property Name:要设置的属性名,必要属性;
(2)Property Value:要设置的属性的值,必要属性;
(3)True/False:原值是否要返回,非必要属性;当设置为“true”,将返回原始值。
注:该函数的参数无需使用双引号引用。
2、__property
- 功能:该属性函数返回JMeter属性的值,如果找不到属性值且没有提供默认值,则直接返回属性名。
- 作用域:可跨线程使用。
- 用法:${__property(property name, variable name, default value)}
(1)property name:要检索的属性名,必填;
(2)variable name:重用该函数计算的值的引用名,非必填;
(3)default value:前面属性的默认值,非必填。
3、__P
- 功能:简化版的__property函数,用于返回JMeter属性的值。它不像__property函数那样有可以存值的变量,并且如果没有提供默认值,则假定默认给1,原因是它对常见的测试变量(如循环、线程数、ramp
up等)有效。 - 作用域:可跨线程使用。
- 用法:${__P(property name, default value)}
(1)property Name:要检索的属性名,必要属性;
(2)Default Value:默认值,不填的话会默认设置1,非必要属性。
4、vars.put
- 功能:用于设置属性值。
- 作用域:当前线程组,必须在beanshell中使用。
- 用法:vars.put(var, value)
(1)var:变量名,string类型;
(2)value:变量值,string类型。
5、vars.get
- 功能:用于获取属性值。
- 作用域:当前线程组,必须在beanshell中使用。
- 用法:vars.get(var)
var:变量名,需要使用双引号引用变量名,即vars.get(“var”)。
6、props.put
- 功能:用于设置属性值
- 作用域:跨线程组使用,必须在beanshell中使用。
- 用法:props.put(var, value)
(1)var:变量名,string类型;
(2)value:变量值,string类型。
7、props.get
- 功能:用于获取属性值。
- 作用域:跨线程组使用,必须在beanshell中使用。
- 用法:props.get(var)
var:变量名,需要使用双引号引用变量名,即props.get(“var”)。
8、props.remove
- 功能:用于移除属性。
- 作用域:跨线程组使用,必须在beanshell中使用。
- 用法:props.remove(var)
var:变量名,需要使用双引号引用变量名,即props.remove(“var”)。
beanshell脚本示例
1、Base64加密–预处理
import org.apache.commons.codec.binary.Base64;
String a = vars.get("username"); //得到username变量的值
String b = vars.get("password");
log.info(a); //查看log日志,判断username的值是否正确
log.info(b);
String aa = Base64.encodeBase64String("${username}".getBytes("utf-8")); //加密
String bb = Base64.encodeBase64String("${password}".getBytes("utf-8"));
log.info(aa);
log.info(bb);
vars.put("username1",aa); //加密后把值赋给username1变量
vars.put("password1",bb);
2、日期格式转换为时间戳(秒级)–预处理
import java.text.*;
import java.util.Date;
String begTime1 = vars.get("begTime1");
String endTime1 = vars.get("endTime1");
Date time1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(begTime1);
Date time2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(endTime1);
String begTime = String.valueOf(time1.getTime()/1000);
String endTime = String.valueOf(time2.getTime()/1000);
vars.put("begTime",begTime);
vars.put("endTime",endTime);
3、判断数据一致–断言
- 对比数值
//获取数据
String num1= vars.get("numsum");
String ZDKL1= vars.get("ZDKL_1");
//numsum为整数,ZDKL_1为小数,将数据转为double类型
String num =String.valueOf(Double.parseDouble(num1));
String ZDKL =String.valueOf(Double.parseDouble(ZDKL1));
if(num==ZDKL) //数值比对,==相等,!=不相等
{
Failure=false;
FailureMessage="数据一致";//对比一致时返回信息
}
else{
Failure=true;
FailureMessage="数据不一致,数据库:"+ZDKL+",接口1:"+num;//对比不一致时返回信息
}
- 对比字符串
//获取数据
String num1= vars.get("numsum");
String ZDKL1= vars.get("ZDKL_1");
//numsum为整数,ZDKL_1为小数,先将数据转为double类型,再转为字符串
String num =String.valueOf(Double.parseDouble(num1));
String ZDKL =String.valueOf(Double.parseDouble(ZDKL1));
if(num.equals(ZDKL)) //字符串对比.equals
{
Failure=false;
FailureMessage="数据一致";//对比一致时返回信息
}
else{
Failure=true;
FailureMessage="数据不一致,数据库:"+ZDKL+",接口1:"+num;//对比不一致时返回信息
}
4、返回数组求和–后置处理
- 返回数据所有同一字段求和
String key = vars.get("key_ALL");//将jmete变量转换成String,并传入key
String[] str = key.split(",");
list = Arrays.asList(key.split(","));//转换成列表
int sum=0;
for (int i = 0; i < list.size(); i++) {
String value = list.get(i);//将遍历出来的值转换成String,并传入value
int value1=Integer.parseInt(value);//将value转换成int,并传入value1
sum=sum+value1;//累加
System.out.println(sum);//在启动CMD窗口输出信息
}
vars.put("sum1",sum+"");//将累加出来的值,传入sum1。然后使用${sum1}即可
log.info(sum1);
- 返回数据同一字段间隔求和
String key = vars.get("key_ALL");//将jmete变量转换成String,并传入key
String[] str = key.split(",");
list = Arrays.asList(key.split(","));//转换成列表
int sum1=0;
int sum2=0;
for (int i = 0; i < list.size(); i=i+2) {
String value1 = list.get(i);//将遍历出来的值转换成String,并传入value1
String value2 = list.get(i+1);//间隔求和
int value11=Integer.parseInt(value1);//将value转换成int,并传入value11
int value22=Integer.parseInt(value2);
sum1=sum1+value11;//累加
sum2=sum2+value22;
System.out.println(sum1);
System.out.println(sum2);
}
vars.put("sum1",sum1+"");//将累加出来的值,传入sum1。然后使用${sum1}即可
vars.put("sum2",sum2+"");
5、导出文件–后置处理
import java.io.*;
byte[] result = prev.getResponseData(); //这个是获取到请求返回的数据,prev是获取上个请求的返回
String file_name = "${path2}线路档案导出_${__time(YMDHMS)}.xls"; //代表存放文件的位置和文件名
File file = new File(file_name);
FileOutputStream out = new FileOutputStream(file);
out.write(result);
out.close();
if(file.exists()){
//根据实际情况各业务自己判断是否需要补充对导出文件的内容验证,此处暂时只判断文件是否存在
prev.setResponseData("导出成功","UTF-8");
log.warn("导出成功");
}
else{
prev.setResponseData("导出失败","UTF-8");
log.warn("导出失败");
}
6、base64解密–后置处理
import java.io.*;
import org.apache.commons.codec;
String x1 = vars.get("x1"); //获取加密值
String y1 = vars.get("y1");
log.info("加密后获取的x1------->>"+x1); //查看log日志
log.info("加密后获取的y1------->>"+y1);
log.info("------------开始解密-------------------");
org.apache.commons.codec.binary.Base64 base64=new org.apache.commons.codec.binary.Base64();
String x2=new String(base64.decode(x1));
String y2=new String(base64.decode(y1));
log.info("解密后的x2------->>"+x2);
log.info("解密后的y2------->>"+y2);
log.info("------------解密结束-------------------");
vars.put("x2",x2); //解密密后把值赋给x2
vars.put("y2",y2);