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("返回的数据为[]但是获取不到证券信息"); } }
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、最后实现的效果