jmeterBeanShell断⾔(⼀)
⼀、响应断⾔
1、什么是响应断⾔?
在jmeter中最常⽤的断⾔⽅法是“响应断⾔”,它是通过检查sampler的请求内容和响应结果中是否匹配指定的字符串来判断结果是否正确。
响应断⾔简单实⽤,能够解决⼯作中的⼤部分问题。
尤其是在jmeter4.0版本中在响应断⾔中加⼊了Request Headers、Request Data,使得能够对请求头和请求体进⾏断⾔,满⾜了多样性的断⾔需求,⾮常⽅便。
2、使⽤响应断⾔
响应断⾔的使⽤⾮常简单,通常需要关注如下三点:
“要测试的响应字段”
指我们要进⾏断⾔的内容所在的位置,分为request和response两⼤块,根据实际情况选择即可(最常⽤的是响应⽂本)
“模式匹配规则” (此处提到的1和3对应上图中的数字)
控制上图中的“1”如何匹配“3”
"包括"-------------1包括3,⽀持正则;
“匹配”-------------1完全匹配3,⽀持正则;
“Equals”---------1完全匹配3中的⽂本内容,不⽀持正则,且⼤⼩写敏感;
“Substring”-----1包括3中的⽂本内容,不⽀持正则,且⼤⼩写敏感;
“否”、“或者”----跟前⾯四个选项结合使⽤,分别⽤于逻辑取反、取或。
“要测试的模式”
这⾥填写我们要进⾏断⾔的内容,可以添加多个模式,可以使⽤变量、⽂本、正则表达式(在“包括”和“匹配”模式下)。
⼆、BeanShell断⾔
1、什么是BeanShell断⾔?
BeanShell断⾔可以使⽤beanshell脚本来执⾏断⾔检查,可以⽤于更复杂的个性化需求,使⽤更灵活,功能更强⼤,但是要能够熟练使⽤beanshell脚本。
在这⾥除了可以使⽤beanshell的内置变量外,主要通过 Failure 和 FailureMessage来设置断⾔结果。
下⾯看⼀个简单的⽰例:
其中脚本内容如下:
if ("200".equals(""+ResponseCode) == false )
{
// 响应码不等于200时,设置断⾔失败,并输出失败信息
Failure=true ;
FailureMessage ="Response code was not a 200 response code it was " + ResponseCode + "." ;
print ( "the return code is " + ResponseCode); // this goes to stdout
log.warn( "the return code is " + ResponseCode); // this goes to the JMeter log file
} else {
// 响应码等于200时,设置断⾔成功,并输出成功信息
Failure=false;
FailureMessage = "Return true, and the response code was " + ResponseCode;
}
}
Bean Shell常⽤内置变量
JMeter在它的BeanShell中内置了变量,⽤户可以通过这些变量与JMeter进⾏交互,其中主要的变量及其使⽤⽅法如下:
log:写⼊信息到jmeber.log⽂件,使⽤⽅法:log.info(“This is log info!”);
ctx:该变量引⽤了当前线程的上下⽂,使⽤⽅法可参考:org.apache.jmeter.threads.JMeterContext。
vars - (JMeterVariables):操作jmeter变量,这个变量实际引⽤了JMeter线程中的局部变量容器(本质上是Map),它是测试⽤例与BeanShell交互的桥梁,常⽤⽅法:
a) (String key):从jmeter中获得变量值
b) vars.put(String key,String value):数据存到jmeter变量中
更多⽅法可参考:org.apache.jmeter.threads.JMeterVariables
props - (JMeterProperties - class java.util.Properties):操作jmeter属性,该变量引⽤了JMeter的配置信
息,可以获取Jmeter的属性,它的使⽤⽅法与vars类似,但是只能put进去String类型的值,⽽不能是⼀个对象。对应于java.util.Properties。
a) ("START.HMS"); 注:START.HMS为属性名,在⽂件jmeter.properties中定义
b) props.put("PROP1","1234");
prev - (SampleResult):获取前⾯的sample返回的信息,常⽤⽅法:
a) getResponseDataAsString():获取响应信息
b) getResponseCode() :获取响应code
更多⽅法可参考:org.apache.jmeter.samplers.SampleResult
sampler - (Sampler):gives access to the current sampler
============================================================================================================================================= =============================================================================================================================================
2、编写断⾔判断代码:
if("206".equals("${action_seq_1}") && "3".equals("${trans_status_1}")){
Failure = false;
FailureMessage = "交易成功!";
}else if(!"206".equals("${action_seq_1}")){
json检查Failure = true;
FailureMessage = "交易类型不正确!";
}else if(!"3".equals("${trans_status_1}")){
Failure = true;
FailureMessage = "交易未成功!";
}
============================================================================================================================================= =============================================================================================================================================
BeanShell是jmeter的解释型脚本语⾔,和java语法⼤同⼩异,并有⾃⼰的内置对象和⽅法可供使⽤。
vars:操作jmeter的变量:(String parmStr) 获取jmeter的变量值;vars.put(String key,String value) 把数据存到Jmeter变量中;
prev:获取sample返回的信息,ResponseDataAsString()获取响应信息;ResponseCode()获取响应状态吗;
1、添加⼀个线程组,并依次加上需要的功能组件,右键http请求添加⼀个BeanShell Assertion。
2、我们把json.jar引⼊,可以拷贝到jmeter的lib\ext⽬录下,也可以在计划任务引⼊jar包
import org.json.*;
String responsData = ResponseDataAsString();
JSONObject responseJson = new JSONObject(responsData);
String status = String("code").toString();
if(!status.equals("0")){
Falure = True;
}
=============================================================================================================================================
=============================================================================================================================================
解析response中的内容,并把获取到的value传递到后续的request中,常⽤的⽅法就是在想要解析response的request上添加后置处理器
本章介绍两种常⽤的组件
BeanShell PostProcessor
JSON Extractor
下⾯是具体的操作步骤:
添加后置处理器:BeanShell PostProcessor
获取response中的字符串,并对内容进⾏判断,当response中包含“The wait operation timed out”或者“Oops. Something went wrong ... sorry”时,都认为该request的response不
正确
String response = ResponseDataAsString();
String code = ResponseCode();
log.info("Respnse is " + response);
log.info(code);
int result1 = response.indexOf("The wait operation timed out");
int result2 = response.indexOf("Oops. Something went wrong ... sorry");
if(code == "200" && result1>=0 || result2>=0){
FailureMessage = "OK,check current";
}
else{
Failure = true;
FailureMessage = "ERROR,check error";
}
解析返回的Jason数据,获取name字段的值赋给变量result
{“body”:{“apps”:[{“name”:”111”},{“name”:”222”}]}}
import org.json.*;
脚本中的导⼊的json包需要⾃⼰去⽹络下载后放到\lib\ext下
String response_data = ResponseDataAsString();
JSONObject data_obj = new JSONObject(response_data);
String apps_str = ("body").get("apps").toString();
JSONArray apps_array = new JSONArray(apps_str);
String[] result = new String[apps_array.length()];
for(int i=0;i<apps_array.length();i++){
JSONObject app_obj = new
JSONObject((i).toString());
String name = ("name").toString();
result[i] = name;
}
vars.put("result", String(result));
添加后置处理器:JSON Extractor
解析返回的Jason数据,获取name字段的值带⼊参数到后边的request中
{“body”:{“apps”:[{“name”:”111”},{“name”:”222”}]}}
变量t1的值是111,变量t2的值是222
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论