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断言的更多相关文章

  1. Jmeter接口测试使用beanshell断言json返回

    一般情况下响应断言就能解决很多问题,但是返回复杂的json时就需要用到beanshell断言. 举个例子 免费的接口API www.sojson.com/api/beian/sojson.com ho ...

  2. JMeter中BeanShell断言使用一

    Jmeter Ant Task如何让beanshell断言失败的详细信息展示在report里面 首先必须给beanshell断言添加FailureMessage if(${TotalClient_SS ...

  3. jmeter BeanShell断言(一)

    原文地址https://blog.csdn.net/lijing742180/article/details/81157947 原文地址https://blog.csdn.net/zailushang ...

  4. Jmeter Ant Task如何让beanshell断言失败的详细信息展示在report里面

    首先必须给beanshell断言添加FailureMessage if(${TotalClient_SS}+2!=${TotalClient_SS2}){Failure=true;       Fai ...

  5. jmeter之beanshell断言实例

    .首先储存一个接口的响应结果,比如在http请求的后面添加beanshell后置处理器(BeanShell PostProcessor)来储存http请求的响应结果: import org.json. ...

  6. jmeter之beanshell断言---数据处理

    在做接口测试时,对响应数据的校验是非常重要的部分:在使用Jmeter进行接口测试时,有多种respone校验方式,比如响应断言.BeanShell断言等等,BeanShell断言可以自定义断言,自由灵 ...

  7. 【Jmeter测试】如何使用BeanShell断言判断请求返回的Json相应结果

      脚本结构​上图中,queryMaterialApiDTOListByPkIds是返回Json格式响应结果的请求,然后添加BeanShell断言详细判断Json结果中的值是否正确. Json格式的相 ...

  8. jmeter断言之BeanShell断言

    1.添加BeanShell断言,在Script下面写断言脚本,常用的BeanShell脚本如下: if(!SampleResult.getResponseCode().equals("200 ...

  9. jmeter使用BeanShell断言

    1. 首先存储一个接口的响应结果,如在http请求的BeanShell PostProcessor: import java.io.UnsupportedEncodingException; Syst ...

随机推荐

  1. JS设计模式(8)模板方法模式

    什么是模板方法模式? 定义:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 主要解决:一些方法通用,却在每一个子类都重新 ...

  2. 秦皇岛winter camp 总结

    冬令营在秦皇岛自闭了七天,很多题目看了都没有思路,或者是不知道怎么敲代码.我发现图论的题,自己连怎么建树都给忘了,想了半天.还有很多自己从未接触过的算法.在说说课堂上课的情况,大部分时间都是全程懵逼的 ...

  3. Oracle11g导出为Oracle10g版本数据,解决10g不兼容11g文件

    EXPDP USERID='JCSJ/JCSJ@FZBD' schemas=JCSJ directory=bac_file dumpfile=JCSJ.dmp logfile=JCSJ.log ver ...

  4. Learning-Python【34】:进程之生产者消费者模型

    一.什么是生产者消费者模型 生产者指的是生产数据的任务,消费者指的是处理数据的任务,在并发编程中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据.同样 ...

  5. 关于MVC RouteExistingFiles疑问后续

    前两天写了<关于MVC RouteExistingFiles疑问>,本来希望寻求大佬快速解答,奈何无人问津. 只能查看.NET 源代码,可以使用反编译工具(我用IL spy),也可以在线查 ...

  6. 【转载】URL编码与两次encodeURI

    当使用地址栏提交查询参数时,如果不编码,非英文字符会按照操作系统的字符集进行编码提交到服务器,服务器会按照配置的字符集进行解码,所以如果两者不一致就会导致乱码. encodeURI函数采用UTF-8对 ...

  7. vuejs点滴

    博客0.没事的时候可以看的一些博客:https://segmentfault.com/a/1190000005832164 http://www.tuicool.com/articles/vQBbii ...

  8. string部分方法

    1.string.lastIndexOf() lastIndexOf 是从string末尾查找,但是返回值仍是首部的位置值. 2.string.replace() 放一个正则匹配会全部替换. 3.st ...

  9. 拒绝服务(DoS)理解、防御与实现

    一.说明 我一直不明白为什么拒绝服务,初学着喜欢拿来装逼.媒体喜欢吹得神乎其神.公司招聘也喜欢拿来做标准,因为我觉得拒绝服务和社会工程学就是最名不副实的两样东西.当然由于自己不明确拒绝服务在代码上是怎 ...

  10. sin n次方 x 的降幂公式

    A(n) = ∫ sinⁿx dx= ∫ sinⁿ⁻¹xsinx dx= - ∫ sinⁿ⁻¹x d(cosx)= - sinⁿ⁻¹xcosx + ∫ cosx • d(sinⁿ⁻¹)= - sinⁿ ...