jmeter使用BeanShell编写脚本,以应对业务传参较复杂的场景,需要具备一定的java代码功底
同时beanshell也支持javascript和python的一些语法
JMeter有如下BeanShell组件:
-
定时器: BeanShell Timer
-
前置处理器:BeanShell PreProcessor
-
采样器: BeanShell Sampler
-
后置处理器:BeanShell PostProcessor
-
断言: BeanShell断言
-
监听器: BeanShell Listener
————————————————
JMeter BeanShell的内置变量
JMeter在内嵌BeanShell时默认创建了一些内置变量,以方便使用者调用,以下是一些常用的BeanShell内置变量:
1)vars
vars可以说是最常用的内置变量,其类型为JMeterVariables,其作用是添加或获取JMeter线程变量:
字符三种转换形式:
vars.put("aaaa","111".toString());
vars.put("aaaaa", "" + 1);
vars.put("aaaaaa", (String)"1");
2)props
vars是不能跨线程组使用的,即在线程组A中put的值在线程组B中时get不到的,props就是为了解决上述问题:
vars和props的区别:
1、vars 只能保持String 或者Objec, props 是 Hashtable 对象
2、vars 只能在当前线程内使用,props 可以跨线程组使用
3)ctx
ctx是当前线程的上下文,其类型为JMeterContext,该变量能做的事非常多,一般需要的动作在其他内置变量里都有提供,除非要做一些复杂的线程控制,详细查看JavaDoc。
4)log
log就是输出不同等级的日志:
5)data和SamplerData
data和SamplerData就是sampler data(请求数据),其类型为byte []:
String samplerData = new String(data);
6)Label和SampleLabel
Label和SampleLabel是sampler的标题,其类型是String。
7)IsSuccess
IsSuccess表示sampler的成功失败,其类型为boolean。
8)prev和SampleResult
prev和SampleResult是当前sampler的结果,其类型为SampleResult,它可以读写sampler的信息和控制sampler的行为。
获取当前线程组中的返回信息,放在请求下一层,如果与请求同层则取值为空,prev表示当前线程
比如处理返回信息{“body”:{“apps”:[{“name”:”111”},{“name”:”222”}]}}提取name值,代码如下:
import org.json.*;
String response_data = prev.getResponseDataAsString();
vars.put("response_data",response_data);
JSONObject data_obj = new JSONObject(response_data);
String apps_str = data_obj.get("body").get("apps").toString();
vars.put("apps_str",apps_str);
JSONArray apps_array = new JSONArray(apps_str);
String[] result = new String[apps_array.length()];
vars.put("result",result);
for(int i=0;i<apps_array.length();i++){undefined
JSONObject app_obj = new JSONObject(apps_array.get(i).toString());
String name = app_obj.get("name").toString();
result[i] = name;
}
vars.put("result", Arrays.toString(result));
————————————————
9)ResponseData
ResponseData就是sampler response data(响应数据),其类型为byte []:
String samplerData = new String(ResponseData);
10)ResponseCode和ResponseMessage
ResponseCode和ResponseMessage是响应报文的响应码和响应信息,其类型为String。
11)Failure和FailureMessage
Failure和FailureMessage是BeanShell Assertion组件独有的内置变量,其作用是设置当前sampler的测试结果(成功或失败),Failure的类型是boolean,FailureMessage的类型是String。
// 设置sampler为测试通过
Failure = true;
// 设置sampler为测试失败
Failure = false;
FailureMessage = "测试失败";
12)Response
Response其实就是SampleResult,为啥这样设计我也不懂,估计是满足不同的语意吧。
在BeanShell Assertion组件,有两个常用的方法Response.setStopThread(boolean)、Response.setStopTest(boolean),其作用是停止执行当前sampler。他们的区别是:
setStopThread(boolean)只停止sampler所在的线程
setStopTest(boolean)停止整个jmeter测试
Failure = false;
FailureMessage = "测试失败";
Response.setStopThread(true)
————————————————
请注意,以上变量并不是每个BeanShell组件都有,也并不是每个变量都支持读和写,具体请查看组件的详细说明,接下来将一一讲解。
引用
1)、jar引用
测试计划中添加jar包
1、使用的jar包需先放入jmeter/lib/ext文件夹中
2、放置jar包后jmeter需重启
2)、非jar包引用
1、java文件
如下:
package test;
public class Myclass
{undefined
public int add(int a, int b)
{undefined
return a + b;
}
}
————————————————
2、class文件
“javac+文件”将java文件转换为class文件
1、public class定义类和class定义类时: 如果一个类声明的时候使用了public class进行了声明,则类名称必须与文件名称完全一致。 如果类的声明使用了class的话,则类名称可以与文件名称不一致,但是执行的时候,执行的是生成后的名称【HelloJava】。
2、文件声明上: 在一个*.java的文件中,只能有一个public class的声明,但是允许有多个class的声明
3、class文件与原java文件放置同一目录下
3)、直接引用
在其它组件中设置参数
引用多个时每个引用参数间用空格隔开
1、传入参数引用
2、直接${}引用