总结学习过程--Java接口自动化初级框架迭代器Iterator解决接口测试效率问题

Posted makeGun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了总结学习过程--Java接口自动化初级框架迭代器Iterator解决接口测试效率问题相关的知识,希望对你有一定的参考价值。

最近出现一个问题,接口入参字段过多(接口传入200多个字段),导致人工测试执行出现没有耐心一个一个测试字段,从而引发几个字段非空校验出了问题。

解决方案目的:引入迭代器,解决当接口字段参数过多的时候,接口字段参数测试容易被忽略的情况。

解决方案适应的接口入参格式:有如图所示的复杂度和层级的接口格式都可以直接使用,不限制参数个数。head测试环境一般是写死不校验,主要校验逻辑都是在body里面。

解决方案思路
1.判断第一个层级是否是body。
2.选择增强for循环遍历还是选择for循环遍历,还是选择迭代器遍历。
3.第二层为list的下层只考虑了map,没考虑第三层为list和键值对的情况,主要是目前没碰到这样的接口设计。

彩蛋:
修改的值可以采用枚举的方式传入到执行的方法里面去,工作中是这样,分享的这个没写。

手动接口测试效率大幅度提升,每个接口测试传空如果需要1分钟,200个参数,测试一次为空的场景,需要1*200分钟,再测试字段为特殊字符,字段长度,字段格式,字段。。。。引用这个,实际只需要几分钟全部跑完所有场景。而且每次上线之前都可以全量回归。太香了

package test;


import org.testng.annotations.Test;
import java.text.SimpleDateFormat;
import java.util.*;

public class iteratorTestDemo {



    /**
     * 续要测试的已经组装好的报文参数
     * */
    public Map<String, Object> test_0001(){
       System.out.println("1");
       return new HashMap<>();
   }

   /**
    * 需要执行的测试方法---执行这个就行
    * */
    @Test
    public iteratorTestDemo() throws Exception {
        TestT(test_0001(),"修改后的value值"); //二审
    }

//    String value_T ="修改后的value值";       //需要测修改的值,字段为空,字段为特殊字符,字段长度,字段类型等等。

    /**
     *     注意:a.封装成公共方法,后面任意接口都可以直接调用,当做入参传入即可
     *          b.需要提前组装好的入参报文,并且初始化有正确的值
     * @param paramMap value_T
     * @throws Exception
     */
    public void TestT(Map<String, Object> paramMap,String value_T) throws Exception {     //组装map,提供遍历之后的map,每次修改一个入参

        //第一层
//        for (Map.Entry entry_1 : paramMap.entrySet()) { //遍历map里面的键值对   for-each增强for循环
        Iterator heaBodyMap_iterator = paramMap.entrySet().iterator();
        while (heaBodyMap_iterator.hasNext()) {
            Map.Entry heaBodyMap_entry = (Map.Entry) heaBodyMap_iterator.next();
            Object heaBodyMap_key = heaBodyMap_entry.getKey(); //获取到key,
            Object heaBodyMap_value = heaBodyMap_entry.getValue();//获取到value
            Object heaBodyMap_value2 = heaBodyMap_value;   //先保存初始化的value值,然后后面再赋值回去

            //第二层
            if (heaBodyMap_key == "head") {
                System.out.println("请求头部写死,不需要测试");
            }
            if (heaBodyMap_key == "body") {   //多层map--body
                if (heaBodyMap_value instanceof Map) {
                    Map<String, Object> heaBodyMap_value_map = (Map<String, Object>) heaBodyMap_value;  //强制转换成map
                    //不可用用for循环
                    Iterator bodyLevel_iterator = heaBodyMap_value_map.entrySet().iterator();
                    while (bodyLevel_iterator.hasNext()) {
                        Map.Entry bodyLevel_entry = (Map.Entry) bodyLevel_iterator.next();

                        Object bodyLevel_key = bodyLevel_entry.getKey(); //获取到key
                        Object bodyLevel_value = bodyLevel_entry.getValue();//获取到value
                        Object bodyLevel_value2 = bodyLevel_value;   //先保存初始化的value值,然后后面再赋值回去
                        heaBodyMap_value_map.put((String) bodyLevel_key, value_T);

                        //组装报文发起请求-断言结果放这里,然后断言之后再把报文初始化

                        //恢复最初的map
                        heaBodyMap_value_map.put((String) bodyLevel_key, bodyLevel_value2); //再恢复初始化的第二层map
                        paramMap.put((String) heaBodyMap_key, heaBodyMap_value_map);//再恢复初始化的第一层map
//                        System.out.println("+++++++++++第一层恢复之后的paramMap:::::::  " + paramMap);

                        //第三层--是map
                        if (bodyLevel_value instanceof Map) {  //如果第二层是map,遍历map
                            Map<String, Object> bodyLevel_value_map = (Map<String, Object>) bodyLevel_value;
                            //循环第三层
                            Iterator threeLevelForMap_iterator = bodyLevel_value_map.entrySet().iterator();
                            while (threeLevelForMap_iterator.hasNext()) {
                                Map.Entry threeLevelForMap_entry = (Map.Entry) threeLevelForMap_iterator.next();
                                Object threeLevelForMap_key = threeLevelForMap_entry.getKey(); //获取到key,
                                Object threeLevelForMap_value = threeLevelForMap_entry.getValue();//获取到value
                                Object threeLevelForMap_value2 = threeLevelForMap_value;   //先保存初始化的value值,然后后面再赋值回去

                                //组装报文发起请求-断言结果放这里,然后断言之后再把报文初始化

                                //复原原始map
                                bodyLevel_value_map.put((String) threeLevelForMap_key, threeLevelForMap_value2);
                                paramMap.put((String) heaBodyMap_key, heaBodyMap_value_map);//把重新组装第一层的map,将第二层的map修改完之后放入
//                                System.out.println("+++++++++++第一层恢复之后的paramMap:::::::  " + paramMap);

                                if (threeLevelForMap_value instanceof Map){     //第三层的value是map,第四层也是map
                                    Map<String, Object> threeLevelForMap_map = (Map<String, Object>) threeLevelForMap_value;
                                    //循环第四层--map
                                    Iterator fourLevelForMap_1_iterator = threeLevelForMap_map.entrySet().iterator();
                                    while (fourLevelForMap_1_iterator.hasNext()) {
                                        Map.Entry fourLevelForMap_1_entry = (Map.Entry) fourLevelForMap_1_iterator.next();//便利每一个键值对
                                        Object fourLevelForMap_1_key = fourLevelForMap_1_entry.getKey();
                                        Object fourLevelForMap_1_value = fourLevelForMap_1_entry.getValue();
                                        Object fourLevelForMap_1_value2 = fourLevelForMap_1_value;

                                        threeLevelForMap_map.put((String) fourLevelForMap_1_key,value_T);
                                        paramMap.put((String) heaBodyMap_key, heaBodyMap_value_map);//把重新组装第一层的map,将第二层的map修改完之后放入

                                        //组装报文发起请求-断言结果放这里,然后断言之后再把报文初始化


                                        //复原原始map
                                        threeLevelForMap_map.put((String) fourLevelForMap_1_key,fourLevelForMap_1_value2);
                                        paramMap.put((String) heaBodyMap_key, heaBodyMap_value_map);//把重新组装第一层的map,将第二层的map修改完之后放入
//                                        System.out.println("+++++++++++第一层恢复之后的paramMap:::::::  " + paramMap);

                                    }
                                }
                                if (threeLevelForMap_value instanceof List){     //第三层的value是map,第四层是list
                                    List<Map<String,Object>> threeLevelForMap_list = (List)threeLevelForMap_value; //
                                    //迭代
                                    Iterator<Map<String,Object>> fourLevelForMap_2_iterator = threeLevelForMap_list.iterator();
                                    while (fourLevelForMap_2_iterator.hasNext()){
                                        Map<String,Object> fiveLevelForMap_2_map = fourLevelForMap_2_iterator.next();//把便利的list,转化成map
                                        Iterator fiveLevelForMap_2_iterator = fiveLevelForMap_2_map.entrySet().iterator();//便利list里面的每一个键值对
                                        while (fiveLevelForMap_2_iterator.hasNext()){
                                            Map.Entry fiveLevelForMap_2_entry = (Map.Entry) fiveLevelForMap_2_iterator.next();//获取键值对
                                            Object fiveLevelForMap_2_key = fiveLevelForMap_2_entry.getKey();
                                            Object fiveLevelForMap_2_value = fiveLevelForMap_2_entry.getValue();
                                            Object fiveLevelForMap_2_value2 = fiveLevelForMap_2_value;

                                            fiveLevelForMap_2_map.put((String) fiveLevelForMap_2_key,value_T);
                                            paramMap.put((String) heaBodyMap_key, heaBodyMap_value_map);//把重新组装第一层的map,将第二层的map修改完之后放入

                                            //组装报文发起请求-断言结果放这里,然后断言之后再把报文初始化

                                            //复原原始map
                                            fiveLevelForMap_2_map.put((String) fiveLevelForMap_2_key,fiveLevelForMap_2_value2);
                                            paramMap.put((String) heaBodyMap_key, heaBodyMap_value_map);//
//                                        System.out.println("+++++++++++第一层恢复之后的paramMap:::::::  " + paramMap);
                                        }
                                    }
                                }
                            }
                        }
                        //第三层--是list
                        if (bodyLevel_value instanceof List) {
                            List<Map<String, Object>> bodyLevel_value_list = (List) bodyLevel_value;//如果第三层是list,遍历list

                            //迭代
                            Iterator<Map<String, Object>> threeLevelForList_iterator = bodyLevel_value_list.iterator();
                            while (threeLevelForList_iterator.hasNext()) {
                                Map<String, Object> threeLevelForList_map = threeLevelForList_iterator.next();//把遍历的list内部,如果还有一层,就转换成map

                                //第四层--是map---
                                //迭代
                                Iterator fourLevelForMap_iterator = threeLevelForList_map.entrySet().iterator();
                                while (fourLevelForMap_iterator.hasNext()) {
                                    Map.Entry fourLevelForMap_entry = (Map.Entry) fourLevelForMap_iterator.next();

                                    Object fourLevelForMap_key = fourLevelForMap_entry.getKey(); //获取到key,
                                    Object fourLevelForMap_value = fourLevelForMap_entry.getValue();//获取到value
                                    Object fourLevelForMap_value2 = fourLevelForMap_value;   //先保存初始化的value值,然后后面再赋值回去

                                    threeLevelForList_map.put((String) fourLevelForMap_key, value_T);
                                    paramMap.put((String) heaBodyMap_key, heaBodyMap_value_map);//再恢复初始化的第一层map

                                    //组装报文发起请求-断言结果放这里,然后断言之后再把报文初始化

                                    //复原原始map
                                    threeLevelForList_map.put((String) fourLevelForMap_key, fourLevelForMap_value2);//再恢复初始化的第四层map-----没有再更新第三层的list列表。因为list里面是引用的map,引用的引用的引用的,重要的事情说三遍
                                    paramMap.put((String) heaBodyMap_key, heaBodyMap_value_map);//再恢复初始化的第一层map
//                                    System.out.println("+++++++++++第一层恢复之后的paramMap:::::::  " + paramMap);


                                    //第五层
                                    if (fourLevelForMap_value instanceof Map) {
                                        //第五层map---
                                        Map<String, Object> fiveLevelForMap_map = (Map) fourLevelForMap_value;//把第四层的map-value赋值给第五层map
                                        //迭代
                                        Iterator fiveLevelForMap_iterator = fiveLevelForMap_map.entrySet().iterator();
                                        while (fiveLevelForMap_iterator.hasNext()) {
                                            Map.Entry fiveLevelForMap_entry = (Map.Entry) fiveLevelForMap_iterator.next();
                                            Object fiveLevelForMap_key = fiveLevelForMap_entry.getKey(); //获取到key,  fiveLevelForMap_key
                                            Object fiveLevelForMap_value = fiveLevelForMap_entry.getValue();//获取到value
                                            Object fiveLevelForMap_value2 = fiveLevelForMap_value;   //先保存初始化的value值,然后后面再赋值回去

                                            fiveLevelForMap_map.put((String) fiveLevelForMap_key, value_T);
                                            paramMap.put((String) heaBodyMap_key, heaBodyMap_value_map);//再恢复初始化的第一层map

                                            //组装报文发起请求-断言结果放这里,然后断言之后再把报文初始化

                                            //复原原始map
                                            fiveLevelForMap_map.put((String) fiveLevelForMap_key, fiveLevelForMap_value2);
                                            paramMap.put((String) heaBodyMap_key, heaBodyMap_value_map);//再恢复初始化的第一层map
//                                            System.out.println("+++++++++++第一层恢复之后的paramMap:::::::  " + paramMap);


                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

        }
    }
}






以上是关于总结学习过程--Java接口自动化初级框架迭代器Iterator解决接口测试效率问题的主要内容,如果未能解决你的问题,请参考以下文章

Java 集合框架迭代器(Iterator)

20182303 2019-2020-1 《数据结构与面向对象程序设计》第4周学习总结

JAVA-初步认识-常用对象API(集合框架-迭代器使用)

Java学习之集合框架的迭代器--Iteratorjk及ListItertor接口

Java集合框架--Collection接口的使用 & 迭代器(Iterator)遍历原理

Java学习:迭代器简介