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

事情是这样的,现在在测试一个接口A,接口返回的数据字段x预期应该是另外两个接口的B\C字段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、现在存在一个问题接口B\C获取的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("返回的数据为[]但是获取不到证券信息");
            }
        }
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、最后实现的效果

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

 

 

test2-获取上一接口返回的数据set,做校验

 

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

上一篇:基于MVC4+EasyUI的Web开发框架经验总结(17)--布局和对话框自动适应大小的处理


下一篇:【Elastic Engineering】Elasticsearch:创建 Runtime field 并在 Kibana 中使用它 - 7.11 发布