Jmeter之BeanShell

在Jmeter中各种分类组件中都有相应的BeanShell组件,这里简单的说明一下Beanshell的使用。

一、概念

BeanShell是一种符合Java语法的脚本语言,也有自己的一些特定语法

二、内置变量

Jmeter在它的Beanshell中内置了变量,用户可以通过这些变量与Jmeter进行交互,其中主要的变量及使用方法如下:

1、log:

在调试脚本的时候,可以将结果输出到日志,判断结果是否正确。使用log时会将日志信息保存到jmeter.log文件中,也可以打开log viewer实时查看日志信息。

常用方法为:log.info("");

注意在使用log.info输出信息的时候,如果变量的值是字符型,一定要在调用变量的时候,加双引号。

2、vars:

操作jmeter变量,常用的方法有:

(1、vars.get("变量名"):从jmeter变量中获取值;

(2、vars.put("变量名",变量):将beanshell中的变量值,复制给Jmeter变量,在Jmeter的后续使用中可以通过变量名调用。

3、prev:

获取前一个取样器的返回值,常用的方法有:

(1、getResponseDataAsString():获取前一个取样器的响应信息;

(2、getResponseCode():获取前一个取样器的响应Code;

4、其他的变量ctx和props(操作属性)

BeanShell断言:

用户可以在jmeter- “beanShell断言”中自定义断言。自由灵活的用脚本实现自己的断言  
beanShell断言接口介绍  
在beanShell中直接可以调用的变量,无需加前缀。  
1.log 打印日志 log.info(“在控制台打印日志”);  
2.SampleResult 获取SampleResult对象,可以通过这个对象获取想要的信息  
3.Response 获取Response对象,可以通过这个对象获取对应的信息  
4.Failure 查看接口调用是否成功,如果返回false是成功的,true是失败的  
5.FailureMessage 失败信息,没有设置的时候失败信息是空的。可以set这个信息  
6.ResponseData 获取 response body,类型是byte[]  
7.ResponseCode 返回接口code,成功是200  
8.ResponseMessage 获取msg,成功是OK  
9.ResponseHeaders 获取接口服务端返回的头部信息  
10.RequestHeaders 获取客户端请求的头部信息  
11.SampleLabel 获取接口请求的名称  
12.SamplerData 获取请求的url和body  
13.ctx 代表上下文信息,可以直接使用  
14.vars 可以直接调用,将获取的数据变成jmeter变量(put),也可以获取用户自定义的变量(get)  
eg:  
1.在http sample下添加一个beanShell断言  
2.编写script  
import org.apache.jmeter.assertions;  
import org.apache.jmeter.samplers.SampleResult;  
import org.apache.jmeter.assertions.AssertionResult;  
import org.json.*; 

String response_data = prev.getResponseDataAsString();//获取接口返回的response数据  
JSONObject data_obj = new JSONObject(response_data);//转换成json  
//判断code是否等于0 如果等于0 再取里面的字段  
String code = data_obj.get(“code”);  
if(code.equals(“0”))  
{  
String user_name = data_obj.get(“data”).get(“user”).get(“userName”).toString();  
//这里的my_name 是用户自定义的变量或者之前的接口返回获取的  
if(user_name.equals(${my_name})){  
Failure = false; //设置成false 表示接口跑成功,在结果树中sample是绿色的  
//做后续动作  
…….  
}  
else{  
//做其他动作  
}  
}  
else  
{  
Failure = true;//直接判断失败,表示接口跑失败,在结果树中sample是红色的  
prev.setStopThread(true);//如果断言失败,后面的接口不需要再跑,直接暂停  
} 

三、一些简单的使用

1、BeanShell响应断言

![]()

因为用到了Json.jar(json-20180813.jar),所以需要先将json.jar导入。

![]()

2、BeanShell Sampler

![]()

例:

import org.json.*;
String response_data=prev.getResponseDataAsString();
log.info("交易返回:"+response_data);
JSONObject data_obj = new JSONObject(response_data);
String code = data_obj.get("respCode").toString();
log.info("code:"+code);
if(code.equals("R200")){
    log.info("交易成功");
    FileWriter fstream = new FileWriter("D:\\apache-jmeter-3.3\\bin\\result\\idtxn_R200.csv",true);
    BufferedWriter out = new BufferedWriter(fstream);
    out.write(vars.get("idTxn")+"\n");
    out.close();
    fstream.close();
    Failure = false;//设置成false 表示接口跑成功,在结果树中sample是绿色的 
}else if(code.equals("R998")){
    log.info("交易失败");
    FileWriter fstream = new FileWriter("D:\\apache-jmeter-3.3\\bin\\result\\idtxn_R998.csv",true);
    BufferedWriter out = new BufferedWriter(fstream);
    out.write(vars.get("idTxn")+"\n");
    out.close();
    fstream.close();
    Failure = true;
}

对上面例子进行优化:

1.对写文件操作,添加公共方法,并使用相对路径,增加代码可移植性

import org.json.*;
source("\\java\\RecordIdTxn.java");//java文件放在bin目录下,可以使用相对路径,增加代码可移植性
vars.put("resultPath",System.getProperty("user.dir")+"\\result");//在bin目录下新建一个result目录,用于存放执行结果记录
log.info("获取相对路劲:"+"${resultPath}");
String response_data=prev.getResponseDataAsString();
log.info("交易返回:"+response_data);
JSONObject data_obj = new JSONObject(response_data);
String code = data_obj.get("respCode").toString();
log.info("code:"+code);
if(code.equals("R200")){
    log.info("交易成功");
    //FileWriter fstream = new FileWriter("D:\\apache-jmeter-3.3\\bin\\result\\idtxn_R200.csv",true);
    //BufferedWriter out = new BufferedWriter(fstream);
    //out.write(vars.get("idTxn")+"\n");
    //out.close();
    //fstream.close();
    RecordIdTxn("D:\\apache-jmeter-3.3\\bin\\result\\idtxn_R200.csv");//如果没有idtxn_R200.csv文件,会自动生成该文件
    Failure = false;//设置成false 表示接口跑成功,在结果树中sample是绿色的 
}else if(code.equals("R998")){
    log.info("mcs system error...");
    RecordIdTxn("D:\\apache-jmeter-3.3\\bin\\result\\idtxn_R998.csv");
    Failure = true;
}else{
    log.info("其他异常");
    RecordIdTxn("D:\\apache-jmeter-3.3\\bin\\result\\idtxn_other.csv");
    Failure=true;
}

声明:该文章系转载,转载该文章的目的在于更广泛的传递信息,并不代表本网站赞同其观点,文章内容仅供参考。

本站是一个个人学习和交流平台,网站上部分文章为网站管理员和网友从相关媒体转载而来,并不用于任何商业目的,内容为作者个人观点, 并不代表本网站赞同其观点和对其真实性负责。

我们已经尽可能的对作者和来源进行了通告,但是可能由于能力有限或疏忽,导致作者和来源有误,亦可能您并不期望您的作品在我们的网站上发布。我们为这些问题向您致歉,如果您在我站上发现此类问题,请及时联系我们,我们将根据您的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。