Beanshell断言
Beanshell断言示例一:通过从数据库查询结果集,和从接口返回中解析json格式的返回内容,比较两者来验证sample请求是否成功
1>先通过JDBC PreProcessor把测试计划中所有接口请求涉及到的表的列名和对应的数据类型从information_schema库的COLUMNS表中查询出来存到一个变量里面
SELECT DISTINCT column_name, data_type
FROM COLUMNS
WHERE table_name IN ("t_bd_block",
"t_bd_build",
"t_bd_build_detail",
"t_bd_build_education",
"t_bd_build_hospital",
"t_bd_build_project",
"t_bd_build_schdist",
"t_bd_build_tag",
"t_bd_build_traffic",
"t_bd_floor",
"t_bd_house",
"t_bd_house_type",
"t_bd_picture",
"t_bd_project",
"t_bd_seo",
"t_bd_tag",
"t_bd_unit",
"t_bd_use",
"t_bd_use_sub",
"t_city",
"t_county",
"t_developer_company",
"t_idcenter",
"t_nation",
"t_poi",
"t_poi_education",
"t_poi_education_pic",
"t_poi_enrollment_plan",
"t_poi_graduation",
"t_poi_hospital",
"t_poi_station_pic",
"t_poi_sub",
"t_poi_subway_stations",
"t_poi_traffic_bus_station",
"t_poi_traffic_line",
"t_poi_traffic_line_station",
"t_poi_traffic_station",
"t_property_company",
"t_province",
"t_region",
"t_static_type");

2>把第1步中查出来的getColumnType解析出来,以键值对的形式存到变量vars供后面使用,因为json格式的数据有些类型的数据要加双引号,有些不需要,这时候就需要知道字段类型来判断下


ArrayList getColumnType1=vars.getObject("getColumnType");
ArrayList column_name = new ArrayList();
ArrayList data_type = new ArrayList();
for(HashMap row : getColumnType1){
Iterator it = row.entrySet().iterator();
while(it.hasNext()){
Map.Entry pair = (Map.Entry)it.next();
log.info(pair.getKey()+"="+pair.getValue());
if(pair.getKey().toString().equals("column_name")){
column_name.add(pair.getValue().toString());
}else if(pair.getKey().toString().equals("data_type")){
data_type.add(pair.getValue().toString());
}
}
}
for(int i=0;i<column_name.size();i++){
vars.put(column_name.get(i).toUpperCase(),data_type.get(i));
}
3>从数据库中把要验证的结果查询出来存到变量里面,变量存的是结果集


4> 对结果进行断言
ArrayList sqlResult1=vars.getObject("sqlResult");
String json = "";
if(sqlResult1.size()==0){
json= "[]"; //如果jdbc request查询结果为空,返回[]
}else{
for(HashMap row : sqlResult1){
String r="";
Iterator it = row.entrySet().iterator();
ArrayList keyAndValue = new ArrayList();
while(it.hasNext()){
Map.Entry pair = (Map.Entry)it.next();
log.info("pair:"+pair);
log.info(pair.getKey()+"="+pair.getValue());
if(pair.getValue()==null){
continue;
}else{
String[] subKey = pair.getKey().toString().split("_");
String key = subKey[0];
for(int k=1; k<subKey.length; k++){
key += Character.toUpperCase(subKey[k].charAt(0))+ subKey[k].substring(1);
}
if("varchar".equals(vars.get(pair.getKey().toString().toUpperCase())) || "char".equals(vars.get(pair.getKey().toString().toUpperCase())) || "text".equals(vars.get(pair.getKey().toString().toUpperCase()))){
keyAndValue.add("\""+key+"\":\""+pair.getValue()+"\",");
}else{
keyAndValue.add("\""+key+"\":"+pair.getValue()+",");
}
}
} //while循环结束
Collections.sort(keyAndValue);
for(int i=0;i<keyAndValue.size();i++){
r+=keyAndValue.get(i);
}
r="{"+r.substring(0,r.length()-1)+"},";
json+=r;
}
if(sqlResult1.size() > 1){
json="{\"code\":\"0001\",\"data\":{\"A-G\":["+json.substring(0,json.length()-1)+"]},\"message\":\"ok\"}";
}else{
json="{\"code\":\"0001\",\"data\":{"+json.substring(0,json.length()-1)+"},\"message\":\"ok\"}";
}
}
log.info(json);
String response_data = prev.getResponseDataAsString();
log.info(response_data);
import org.json.*;
log.info("进去了json对象");
JSONObject sql_data_obj = new JSONObject(json);
JSONObject response_data_obj = new JSONObject(response_data);
log.info("进去了json对象");
log.info("拿到了response的json对象"+response_data_obj);
log.info("拿到了sql的json对象"+sql_data_obj);
String responses_str = response_data_obj.get("data").get("A-G").toString();
String sqls_str = sql_data_obj.get("data").get("A-G").toString();
log.info("进去了responses的A-G"+responses_str);
JSONArray responses_array = new JSONArray(responses_str);
JSONArray sqls_array = new JSONArray(sqls_str);
//String[] result = new String[responses_array.length()];
boolean flag=true;
for(int i=0;i<responses_array.length();i++){
JSONObject response_obj = new JSONObject(responses_array.get(i).toString());
JSONObject sql_obj = new JSONObject(sqls_array.get(i).toString());
// String name = app_obj.get("cityId").toString();
Iterator it = response_obj.keys();
while(it.hasNext()){
//获取map的key
String key = (String) it.next();
System.out.println("key: "+key);
//得到value的值
Object response_value = response_obj.get(key);
Object sql_value=sql_obj.get(key);
if(!(sql_value.toString().equals(response_value.toString()))){
flag=false;
break;
}
//递归遍历
// jsonObj.put(key, traveseJson(value));
}
// result[i] = name;
}
//vars.put("result", Arrays.toString(result));
if(flag)//请求的response中有包含自定义字符,则断言结果为false
{
Failure=false;
String message="${__time(yyyy-MM-dd HH:mm:ss,)} 结果比对成功";
FailureMessage=message;
log.info(FailureMessage);
}else
{
Failure=true;
String message="${__time(yyyy-MM-dd HH:mm:ss,)} 结果比对失败";
String response="本次请求response数据:"+prev.getResponseDataAsString()+"----------";
String need_assert="需要断言的数据:"+ json;
FailureMessage=message+response+need_assert;
}
Beanshell断言示例二:从SampleResult对象中获取请求的响应结果码,如果不是200,那就直接让断言失败,如果成功,才去获取json格式的返回内容中的某个值,然后判断后再通过Fqilure对象去设置结果是成功还是失败


Beanshell断言的更多相关文章
- Jmeter接口测试使用beanshell断言json返回
一般情况下响应断言就能解决很多问题,但是返回复杂的json时就需要用到beanshell断言. 举个例子 免费的接口API www.sojson.com/api/beian/sojson.com ho ...
- JMeter中BeanShell断言使用一
Jmeter Ant Task如何让beanshell断言失败的详细信息展示在report里面 首先必须给beanshell断言添加FailureMessage if(${TotalClient_SS ...
- jmeter BeanShell断言(一)
原文地址https://blog.csdn.net/lijing742180/article/details/81157947 原文地址https://blog.csdn.net/zailushang ...
- Jmeter Ant Task如何让beanshell断言失败的详细信息展示在report里面
首先必须给beanshell断言添加FailureMessage if(${TotalClient_SS}+2!=${TotalClient_SS2}){Failure=true; Fai ...
- jmeter之beanshell断言实例
.首先储存一个接口的响应结果,比如在http请求的后面添加beanshell后置处理器(BeanShell PostProcessor)来储存http请求的响应结果: import org.json. ...
- jmeter之beanshell断言---数据处理
在做接口测试时,对响应数据的校验是非常重要的部分:在使用Jmeter进行接口测试时,有多种respone校验方式,比如响应断言.BeanShell断言等等,BeanShell断言可以自定义断言,自由灵 ...
- 【Jmeter测试】如何使用BeanShell断言判断请求返回的Json相应结果
脚本结构上图中,queryMaterialApiDTOListByPkIds是返回Json格式响应结果的请求,然后添加BeanShell断言详细判断Json结果中的值是否正确. Json格式的相 ...
- jmeter断言之BeanShell断言
1.添加BeanShell断言,在Script下面写断言脚本,常用的BeanShell脚本如下: if(!SampleResult.getResponseCode().equals("200 ...
- jmeter使用BeanShell断言
1. 首先存储一个接口的响应结果,如在http请求的BeanShell PostProcessor: import java.io.UnsupportedEncodingException; Syst ...
随机推荐
- JavaScript 声明全局变量和局部变量
JS中声明全局变量主要分为显式声明或者隐式声明下面分别介绍. 声明方式一: 使用var(关键字)+变量名(标识符)的方式在function外部声明,即为全局变量,否则在function声明的是局部变量 ...
- 学习requests_html
一.获取页面上的所有链接. from requests_html import HTMLSession session=HTMLSession() r=session.get('https://new ...
- QThread使用——关于run和movetoThread的区别
QThread 使用探讨 2010-10-23 00:30 注意:本文停止更新,请优先考虑 Qt 线程基础(QThread.QtConcurrent等) dbzhang800 2011.06.18 Q ...
- TestNG详解(单元测试框架)
一.TestNG的优点 1.1 漂亮的HTML格式测试报告 1.2 支持并发测试 1.3 参数化测试更简单 1.4 支持输出日志 1.5 支持更多功能的注解 二.编写TestNG测试用例的步骤 2.1 ...
- 在客户端先通过JS验证后再将表单提交到服务器
问题:想要在客户端先通过JS验证后再将表单提交到服务器 参考资料: jQuery 事件 - submit() 方法 试验过程: 服务器端使用PHP <html> <head> ...
- guxh的python笔记三:装饰器
1,函数作用域 这种情况可以顺利执行: total = 0 def run(): print(total) 这种情况会报错: total = 0 def run(): print(total) tot ...
- Windows 独立启动方式安装 Archiva
在 Windows 中以独立启动方式安装. 你可以将安装文件拷贝到任何你希望运行的目录中,下面的步骤中.我们没有将 Archiva 安装成服务,所以你需要通过控制台的方式来进行启动. Windows ...
- spring cloud(一)带你进入分布式
spring cloud是近年来比较火的热门话题,很多大型公司也渐渐转型使用spring cloud来完善各种开发模式,我认为主要是由spring团队开发由来,致使会有那么多的使用者,在java的领域 ...
- attr VS prop 区别
attr 能够增加.获取.删除页面属性.从页面中获取属性值: prop 用来获取.删除元素自带属性.从属性对象中获取属性值. attr 只获取静态属性值,就是页面加载时的最初的属性值: prop 可以 ...
- 如何解决ORA-28002 the password will expire within 7 days问题(密码快过期)
1.问题描述: 今天登陆pl/sql工具时,提示 ORA-28002 the password will expire within 7 days 2.问题原因: oracle11g中默认在defau ...