全局变量设置与调用

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);