beanshell-接口返回结果与预期结果比较(预期结果为两个接口差集)-两个set集合的比较

事情是这样的,现在在测试一个接口A,接口返回的数据字段x预期应该是另外两个接口的BC字段x的差集。现在要判断接口返回的数据与该差集是否一致。一致则符合预期结果通过,不符合则失败。

思路:

需要比较的X字段值在接口响应中不会重复

1、获取接口B返回x字段,接口返回多条数据则遍历数据将获取的x字段放入set中

2、获取接口C返回x字段,接口返回多条数据则遍历数据将获取的x字段放入set2中,c接口可能返回为空,则set2为空

3、获取接口A返回x字段,接口返回多条数据则遍历数据将获取的x字段放入set1中

4、接口A预期结果应该为set3=set.removeAll(set2)、接口A实际结果为set1

5、判断set3和set1是否都为空,都为空则通;不为空则判断set3.size()和set1()是否相同,不相同则直接失败;如果相同判断set3.containsAll(set1),如果为true则通过,否则不通过

6、现在存在一个问题接口BC获取的set如何通过jmeter, vars.put存放,现在不知道怎么解决???

初步的想法是把set转换成string数组,但是vars.put方法只支持传入string,导致存入数据报错

 //把set转换成string并打印
	        	String[] strs = set.toArray(new String[set.size()]);
	          for (String kk :strs){
		     log.info(kk);} 
               vars.put("set", strs); 

 接着查资料,发现想要存入对象,可以使用vars.putObject("setall", set)方式,那么保存的问题解决了。

现在A接口需要获取B接口的setall对象,则使用Object  obj=vars.getObject("setall");set=(Set)obj;或者set=vars.getObject("setall");问题得解决。

7、

具体代码实现如下(在接口A中加入一个beanshell断言,test)

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSON;
Set set = new HashSet();
Set set1 = new HashSet();
Set set2 = new HashSet();
//获取所有证券集合set
set.add("000762");
set.add("000002");
set.add("000651");
set.add("600019");
set.add("000001");
set.add("002415");
set.add("600570");
set.add("000858");
set.add("600010");
set.add("600000");
set.add("000008");
set.add("600004");
//获取存在本证券融资合约的证券set2
set2.add("600010");
set2.add("000762");
set2.add("000002");
set2.add("000651");
//预期去除融资合约证券的证券,求set set2的差集
 set.removeAll(set2);
//	     for (Object o : set) {
//	         log.info(o.toString());
//	     }
//获取请求的返回值
String response_data = prev.getResponseDataAsString();
log.info(response_data);
Object json = JSON.parse(response_data);
//判断返回数据是json对象(一条数据)还是数据(多条数据),数组判断是否有数据有数据则通过,无数据则不通过,json对象则判断是否有数据
        if(json instanceof JSONObject){
           log.info("对象");
           JSONObject data_obj= JSON.parseObject(response_data);
           String stock_account=data_obj.get("stock_code");
           if (stock_account.length() != 0)
            {
              set1.add(stock_code);      
            } else {
             log.info("持仓证券的数量为空");
            }
        }
        if(json instanceof JSONArray){
           //log.info("数组");
           JSONArray jsonArray = JSON.parseArray(response_data);
        log.info("接口返回的数据条数为");
        int a=jsonArray.size();
        log.info(String.valueOf(a));
        //log.info(jsonArray.toString());
        if (jsonArray.size() != 0)
            {
	              for (int i=0;i<jsonArray.size();i++)
	              {
	              	JSONObject dataObj1 = jsonArray.get(i);
	              	String stock_code=dataObj1.get("stock_code");
	              	set1.add(stock_code); 
	        }
	        //把set转换成string并打印
	        //String[] strs = set.toArray(new String[set.size()]);
	          //for (String kk :strs){
		     //log.info(kk);}  
           //拿接口查询结果与预期结果做比较,判断两个set集合是否一致
           if(set == null || set1 ==null){
	    	 System.out.println("两个集合都为空");
	        }
	     else{
	        if(set.size()!=set1.size()){
	        	log.info("两个集合大小不相等");
	        	//int a =set.size();
	        	//log.info(Integer.toString(a));
	        	//int b =set1.size();
	        	//log.info(Integer.toString(b));
	        }
	        else{
	        	if(set.containsAll(set1)) {
	        		log.info("两个集合相等");	
	        	}
	        	else{
	        		log.info("两个集合个数相同但是元素不相等");
	        		//从预期结果中去除实际结果中相同的元素,找出有哪些元素不符合预期
	        		set.removeAll(set1);
	       	     	for (Object o : set) {
	       	         log.info("预期返回但是没有返回的元素为"+o.toString());
	       	     }
	        	}
	        	
	        	
	        }
	     }
		     
            } else {
             
                log.info("返回的数据为[]但是获取不到证券信息");
            }
        }
test2-获取上一接口返回的数据set,做校验

import
com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSON; Set set = new HashSet(); Set set1 = new HashSet(); Set set2 = new HashSet(); //获取所有证券集合set //Object obj=vars.getObject("setall"); //set=(Set)obj; set=vars.getObject("setall"); //获取存在本证券融资合约的证券set2 set2.add("600010"); set2.add("000762"); set2.add("000002"); set2.add("000651"); //预期去除融资合约证券的证券,求set set2的差集 set.removeAll(set2); // for (Object o : set) { // log.info(o.toString()); // } //获取请求的返回值 String response_data = prev.getResponseDataAsString(); log.info(response_data); Object json = JSON.parse(response_data); //判断返回数据是json对象(一条数据)还是数据(多条数据),数组判断是否有数据有数据则通过,无数据则不通过,json对象则判断是否有数据 if(json instanceof JSONObject){ log.info("对象"); JSONObject data_obj= JSON.parseObject(response_data); String stock_account=data_obj.get("stock_code"); if (stock_account.length() != 0) { set1.add(stock_code); } else { log.info("持仓证券的数量为空"); } } if(json instanceof JSONArray){ //log.info("数组"); JSONArray jsonArray = JSON.parseArray(response_data); log.info("接口返回的数据条数为"); int a=jsonArray.size(); log.info(String.valueOf(a)); //log.info(jsonArray.toString()); if (jsonArray.size() != 0) { for (int i=0;i<jsonArray.size();i++) { JSONObject dataObj1 = jsonArray.get(i); String stock_code=dataObj1.get("stock_code"); set1.add(stock_code); } //把set转换成string并打印 //String[] strs = set.toArray(new String[set.size()]); //for (String kk :strs){ //log.info(kk);} //拿接口查询结果与预期结果做比较,判断两个set集合是否一致 if(set == null || set1 ==null){ System.out.println("两个集合都为空"); } else{ if(set.size()!=set1.size()){ log.info("两个集合大小不相等"); //int a =set.size(); //log.info(Integer.toString(a)); //int b =set1.size(); //log.info(Integer.toString(b)); } else{ if(set.containsAll(set1)) { log.info("两个集合相等"); } else{ log.info("两个集合个数相同但是元素不相等"); //从预期结果中去除实际结果中相同的元素,找出有哪些元素不符合预期 set.removeAll(set1); for (Object o : set) { log.info("预期返回但是没有返回的元素为"+o.toString()); } } } } } else { log.info("返回的数据为[]但是获取不到证券信息"); } }

8、最后实现的效果

原文地址:https://www.cnblogs.com/qiaoli0726/p/14393259.html