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

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

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

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

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断言_Beanshell断言相关推荐

  1. jmeter响应断言使用_十二、Jmeter断言-响应断言、Json断言和Beanshell断言

    所谓断言,就是检查接口的返回是否符合预期. 自动化测试脚本,如果断言做的不好,就好比测试用例不写预期结果,因此我认为断言是最重要一部分. 关于如何做好断言,我觉得要做到:要断言的内容一定是唯一的,每个 ...

  2. Jmeter断言-所有断言讲解

    Jmeter断言-所有断言讲解 jmeter中有个元件叫做断言(Assertion),它的作用和loadrunner中的检查点类似: 用于检查测试中得到的响应数据等是否符合预期,用以保证性能测试过程中 ...

  3. junit断言_JUnit断言

    junit断言 JUnit Assertions allows us to write effective test methods. JUnit 5 is the latest version an ...

  4. Jmeter断言-响应断言

    1:Jmeter断言-响应断言 1.1:添加线程组 1.2:添加http请求 1.3:在http请求下添加"响应断言" 1.4:添加查看结果树和Debug取样器 1:断言成功的结果 ...

  5. 【接口测试基础】第八篇 | PostMan常用断言及断言的工作原理

    Postman常用断言 1.断言响应状态码 Status code: Code is 200 步骤: 1.在Tests标签中,选中Status Code:code is 200,生成对应代码 2.适当 ...

  6. 验证断言(立即断言并行断言)

    目录 1.何为断言 2.断言的作用: 3.断言的种类 3.1立即断言 3.2并发断言 4.断言层次结构 4.1 sequence 序列 4.2 property 序列 5.sequence和prope ...

  7. 性能测试——jmeter接口测试复习——断言——响应断言

    {"ret":200,"data":{"err_code":0,"err_msg":""," ...

  8. python3断言_Python3断言

    断言是一种理智检查,当程序的测试完成,你可以打开或关闭. 断言的最简单的方法就是把它比作 raise-if 语句 (或者更准确,加 raise-if-not 声明). 一个表达式进行测试,如果结果出现 ...

  9. Pytest之pytest-assume同用例多断言,断言1失败会执行后续代码及断言2

    一般我们做自动化测试时,一个用例会写多个断言,当第一个断言失败后,后面的代码就不会执行了,于是我们引进了pytest-assume插件可以解决断言失败后继续断言的问题. 一.安装依赖包 pip ins ...

  10. c语言 静态断言,C断言/静态断言

    关于断言,可以作为一种很强大的调试方式或者程序运行时的错误诊断 但是断言也不是适合于各种地方,服务器软件和嵌入式程序一般不适用,断言会强制中断正在运行的程序,对于服务器等程序来说, 将会是一个灾难.加 ...

最新文章

  1. LastIndexOf属性
  2. oracle数据库多表嵌套,sql – 在oracle中更新多个嵌套表中的多个记录
  3. [C++] C++风格的强制类型转换探讨
  4. php strval,PHP strval()函数
  5. maven常用的命令(window控制台和linux命令是一致的)
  6. 推荐一个包含大量PDF编程电子书的github仓库
  7. node 升级_Node.js 版本知多少?又该如何选择?
  8. leetcode 1143. 最长公共子序列(dp)
  9. JavaScript之改变样式
  10. 管理历程篇---学会四心
  11. 农银电商项目学习笔记(一)
  12. e的n次方要怎么用计算机计算,Excel函数公式大全,使用EXP函数计算常数e的n次方....
  13. JVM-运行时数据区:Java堆(Heap) 内存管理的核心区
  14. 【博客552】git auto-merge原理以及auto-merge的不同模式
  15. 媒体 | 冒志鸿:ArcBlock打造跨链应用平台的思路
  16. 电脑连接WiFi后显示找不到……的DNS地址
  17. 前置++与后置++的不同
  18. 设置FLASH的读写保护及解除—零死角玩转STM32-F429系列
  19. 一个两自由度DIY云台+OpenMV就可以实现简单云台跟踪了,以前的板球控制系统感觉也可以看作一种变相的云台跟踪啊!
  20. mysql表结构设计工具_工具 EZDML表结构设计器

热门文章

  1. js 获取浏览器高度、浏览器宽度
  2. MODIS,Himwari-8遥感数据介绍
  3. 内存碎片与malloc(转)
  4. List集合去重的几种方法
  5. 软件测试面试题:设计系统测试计划需要参考的项目文档?
  6. lwip---(六)ARP表
  7. sql server收缩数据库日志
  8. 达梦数据库启用日志方法,达梦数据库查看日志是否启用,达梦数据库日志文件位置查找
  9. php代码加密工具xend,PHP代码加密工具 Xend v3.0.1
  10. powerdesigner、ERstudio、PDManER工具比较