Bootstrap

JMETER Beanshell

jsonBeanshell的内置变量和方法:

Beanshell有一些默认的内置变量和方法,用户可以通过这些变量与JMeter进行交互
prInt:非GUI模式下打印信息(输出信息到stdout,标准输出控制台)
log:输出信息到日志(文件)
        log.debu(“调试信息”)
        log.info(“响应状态码” + ResponseCode)
        log.warn(“警告信息”)
        log.error(“出错信息”)

ResponseCode:响应状态码(String类型)。
ResponseHeaders:响应头(String类型)。
prev:获取当前请求结果prev:获取当前请求结果
        prev.getResponseDataAsString():获取响应体数据(String类型)。
        prev.getResponseCode():获取状态码(同ResponseCode,String类型)。

vars:操作JMeter变量
        String var1 = vars.get(“变量名”):获取变量的值(假设为String类型)。
        vars.put(“变量名”, 变量值):设置变量值。

props:操作JMeter属性
        props.get(String,String) 可以获取JMeter中已经生成的属性。
        props.put(String,String)可以创建和更新JMeter属性。

ctx:获取当前线程上下文数据(可获取所有信息)
        ctx.getVariables(“变量名”):获取变量值(同vars.get())。
        ctx.setVariables(“变量名”, “变量值”):设置变量(同vars.put())。
        ctx.getProperties(“属性名”):获取属性值(同props.get())。
        ctx.setProperties(“属性名”,“属性值”):设置属性(同props.put())。
        ctx.getPreviousResult():获取当前请求结果同(prev)。
        ctx.getCurrentSampler():获取当前采样器。
        ctx.getPreviousSampler():获取前一采样器。
        ctx.getThreadNum():获取线程数。
        ctx.getThreadGroup():获取线程组。
        ctx. getThread():获取当前线程。
        ctx.getEngine():获取引擎。
        ctx.isSamplingStarted():判断采样器是否启动。
        ctx.isRecording():判断是否开启录制。
        ctx.getSamplerContext():获取采样器山下文数据

JMeterContext API地址

将线程下的局部变量变成全局变量方便其他线程使用,通过beanshell脚本操作步骤:
1、增加beanshell后置,,paramteters参数框写上需要传递的参数${code},如果是多个参数,需要用空格隔开
在beanshell脚本中获取这些参数:
获取传递给beanshell的参数,单个,多个的情况:
String plant = bsh.args[0];【单个】
String sn = bsh.args[2];【多个】
String vin = bsh.args[1];
1获取参数,并拼接【如果需要】
String plant_no = "沪B"+vars.get("plant_no");
2将拼接好的参数传递给局部变量【可有可无,视情况而定】
vars.put("plant_no",plant_no);
3将拼接好的参数传递给全局变量plant
props.put("plant",plant_no);
4将线程组的参数传递给[如果使用2需用如下语句传递给全局变量]
props.put("plant",vars.get("plant_no"));

sn和vin的处理:
props.put("sn",vars.get("sn_no"));
log.info("sn           "+sn);

String vin_no = "vin" + vars.get("vin_no");
props.put("vin",vars.get("vin_no"));

最后在别的线程组调用变量使用${__P(plant,)}或者可以使用property函数

遇到需要判断响应结果是否为自己所需要,而json和context断言无法测试的时候,需要使用beanshell断言

场景:BeanShell断言中可以通过ResponseCode、ResponseHeaders及pre.getResponseDataAsString()来分别获得String格式的响应状态码、响应头、响应体数据。结合if判断,通过变量Failure=false或Failure=true来设置断言是否通过。当设置Failure=true时,还可以设置FailureMessage来设置失败原因。

需求:目前有这样一响应,判断轨迹是否存在,如果lon不存在,那么响应结果是"data":{"driveLocus":null},如果lon存在,则响应结果是"data":{"driveLocus":[{"lon":"xxxx","lat":"xxxx"},{"lon":"xxxx","lat":"xxxx"}]},判断轨迹是否出现

先获取响应内容$.data.driveLocus[*].lon,赋值变量lon,在beanshell断言中,传参${lon},在脚本中判断字段${lon},断言脚本判断响应lon内容是否存在,:

if (bsh.args.length==0){   //判断传参是否为空,为空,断言失败
    Failure=true;
    FailureMessage = "经度获取null";
    }else{
    String lon = bsh.args[0];
    if (lon!=null){   //判断lon的内容是否为空,不为空,断言成功,为空,断言失败
    Failure=true;
    }else{
    Failure=true;
    FailureMessage = "经度获取null";
    }
}

json 后置提取器,提取多变量使用分号分隔,如图所示:

 

 

 

;