接口测试 基于 Excel 数据驱动的单接口自动化接口框架-参数强度测试

CC · 2016年08月24日 · 最后由 回复于 2016年08月26日 · 4075 次阅读

目前接触及了解到的很多接口测试框架,比较缺乏的一点就是对接口参数异常测试比较薄弱,在此我这边说明下我对参数强度测试的理解及实现;
参数测试要包含:
1. 组合所有参数,不包含无 Value 的参数;
例:API 接口参数@Param A,@Param B,@Param C,测试时参数 C 无 Value,因此传参: {"A":"a","B":"b"}

2.组合所有必选参数,不包含无 Value 的参数

例:API 接口参数@Param A(必选),@Param B(必选),@Param C(非必选),测试时参数 B 无 Value,因此传参: {"A":"a"}
3.组合所有非必选参数,不包含无 Value 的参数

例:API 接口参数@Param A(必选),@Param B(非必选),@Param C(非必选),测试时参数 C 无 Value,因此传参: {"B":"b"}
4.组合必选参数+随机非必选参数,不包含无 Value 的参数

例:API 接口参数@Param A(必选),@Param B(必选),@Param C(非必选),@Param D(非必选),测试时传参: {"A":"a","B":"b","C":"c"}
5.组合随机必选参数+所有非必选参数,不包含无 Value 的参数

例:API 接口参数@Param A(必选),@Param B(必选),@Param C(非必选),@Param D(非必选),测试时传参: {"B":"b","C":"c","D":"d"}
6.组合所有参数,但参数有误,不包含无 Value 的参数

例:API 接口参数@Param AA(必选),@Param BB(必选),@Param CC(非必选),@Param DD(非必选),测试时传参: {"A":"aa","B":"bb","C":"cc","D":"dd"}
7.组合必选参数,但参数有误,不包含无 Value 的参数

例:API 接口参数@Param AA(必选),@Param BB(必选),@Param CC(非必选),@Param DD(非必选),测试时传参: {"A":"aa","B":"bb"}
8.组合非必选参数,但参数有误,不包含无 Value 的参数

例:API 接口参数@Param AA(必选),@Param BB(必选),@Param CC(非必选),@Param DD(非必选),测试时传参: {"C":"cc","D":"dd"}
9.组合所有参数,并额外增加一个参数,不包含无 Value 的参数

(例:API 接口参数@Param A(必选),@Param B(必选),@Param C(非必选),@Param D(非必选),测试时传参: {"A":"a","B":"b","C":"c","D":"d","hahahah":"heiheihei"})
10,随机组合必选参数,不包含无 Value 的参数

(例:API 接口参数@Param A(必选),@Param B(必选),@Param C(非必选),@Param D(非必选),测试时传参: {"A":"a"})
11,随机组合非必选参数,不包含无 Value 的参数

例:API 接口参数@Param A(必选),@Param B(必选),@Param C(非必选),@Param D(非必选),测试时传参: {"D":"d"}
12 组合所有参数,包含带空值的参数

例:API 接口参数@Param A(必选),@Param B(必选),@Param C(非必选),@Param D(非必选),测试时 D 值为空,传参: {"A":"a","B":"b","C":"c","D":""}
13.组合所有必选参数,包含带空值的参数

例:API 接口参数@Param A(必选),@Param B(必选),@Param C(非必选),@Param D(非必选),测试时 B 值为空,传参: {"A":"a","B":""}
14.组合所有非必选参数,包含带空值的参数

例:API 接口参数@Param A(必选),@Param B(必选),@Param C(非必选),@Param D(非必选),测试时 D 值为空,传参: {"C":"c","D":""}

举例我实现的其中一个范例,其他实现差不多类似
GET 方法:

/**
     * Get参数强度为1
     * flag = 1,组合所有必选参数,不包含无Value的参数
     * @param apiData HTTP API相关请求参数
     * @return JSON参数
     */
    public static Object OneAsGetParamsFlag(APIData apiData){
        //思路:1.遍历非必选参数列表,若URI中包含非必选参数,则replace掉该参数和参数值
        String uri = apiData.getAPIDataInfo("uri").toString();
        JSONArray paramsFalseList = JSONArray.fromObject(apiData.getAPIDataInfo("paramsFalse"));//参数类型为非必选的参数列表
        JSONObject headerParams = JSONObject.fromObject(apiData.getAPIDataInfo("headerParams"));//HTTP请求Header中的参数信息
        if (!headerParams.isEmpty() && uri.contains("?")) {
            int index = uri.indexOf("?");
            for (int i = 0; i < paramsFalseList.size(); i++) {
                //判断URI ?以后的数据是否包含非必选字段
                if (uri.substring(index, uri.length()).contains(paramsFalseList.get(i).toString())) {
                    String repalceString = paramsFalseList.get(i).toString() + "=" + headerParams.get(paramsFalseList.get(i)).toString();
                    //判断uri中是否还包含&
                    int replaceIndex = uri.indexOf(repalceString) + repalceString.length();
                    //判断长度是否超过了uri长度
                    if (uri.length() > replaceIndex) {
                        if (uri.contains("&")) {
                            //判断需要替换的下一个字符是否为&符
                            if ("&".equals(uri.substring(uri.indexOf(repalceString) + repalceString.length(), uri.indexOf(repalceString) + repalceString.length() + 1))) {
                                repalceString = repalceString + "&";
                            }
                        }
                    }
                    uri = uri.replaceAll(repalceString, "");
                }
            }
            //若末位为?,则自动截取
            if ("?".equals(uri.substring(uri.length() - 1))) {
                uri = uri.substring(0, uri.length() - 1);
            }
            //若末位为&,则自动截取
            if ("&".equals(uri.substring(uri.length() - 1))) {
                uri = uri.substring(0, uri.length() - 1);
            }
            return uri.toString();
        } else {
            return uri.toString();
        }

    }

POST 方法:

/**
     * POST参数强度为1
     * flag = 1,组合所有必选参数,不包含无Value的参数
     * @param apiData HTTP API相关请求参数
     * @return JSON参数
     */
    public static Object OneAsPostParamsFlag(APIData apiData){
        JSONArray paramsFalseList = JSONArray.fromObject(apiData.getAPIDataInfo("paramsFalse"));//参数类型为非必选的参数列表
        //判断params类型
        if ("{".equals(apiData.getAPIDataInfo("params").toString().substring(0, 1))) {
            JSONObject paramsJSONObject = new JSONObject();

            paramsJSONObject = JSONObject.fromObject(apiData.getAPIDataInfo("params"));
            //遍历paramsFalse所有参数
            for (int i = 0; i < paramsFalseList.size(); i++) {
                //若包含params中包含非必选字段,则删除paramsJSONObect中对应key
                if (paramsJSONObject.containsKey(paramsFalseList.get(i))) {
                    paramsJSONObject.remove(paramsFalseList.get(i));
                }
            }
            return paramsJSONObject;
        } else {
            //处理思路:把原始jsonarray中的jsonObject数据进行遍历
            //遍历其中包含非必选字段,并进行remove
            //重新组包成JSONArray
            JSONArray paramsJSONArray = new JSONArray();
            paramsJSONArray = JSONArray.fromObject(apiData.getAPIDataInfo("params"));
            JSONObject tempjson = JSONObject.fromObject(paramsJSONArray.get(0));//把第0序号的数据写入道JSONObject
            JSONArray tempjsonarray = new JSONArray();
            //遍历paramsFalse所有参数
            for (int i = 0; i < paramsFalseList.size(); i++) {
                //若包含params中包含非必选字段,则删除paramsJSONObect中对应key
                if (tempjson.containsKey(paramsFalseList.get(i))) {
                    tempjson.remove(paramsFalseList.get(i));
                }
            }
            tempjsonarray.add(tempjson);
            return tempjsonarray;
        }
    }
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 15 条回复 时间 点赞

提供了新思路,我也在考虑接口的参数组合和参数类型错误的测试

CC #2 · 2016年08月24日 Author

#1 楼 @lose 😄😄😄

—— 来自 TesterHome 官方 安卓客户端

有开源计划吗?

CC #12 · 2016年08月25日 Author

#3 楼 @addison 暂时没有,这段时间在学 Android 开发。。--

不错的思路

CC #7 · 2016年08月26日 Author

#6 楼 @mads 😀 约啥哈?

CC #8 · 2016年08月26日 Author

#6 楼 @mads 杭州测试沙龙?参加😀

#8 楼 @hu_qingen 二期可不能不来哦,多弄点朋友一起来,二期估计 100 人的名额

CC #10 · 2016年08月26日 Author

#9 楼 @mads 😀 😀 😀 😀 没问题

#10 楼 @hu_qingen 你去微信群吧,私下不约,叔叔我们不约

CC #12 · 2016年08月26日 Author

#11 楼 @mads 微信群是?

CC #2 · 2016年08月26日 Author

#13 楼 @mads 二维码已过期。。。- -

#14 楼 @hu_qingen 点击链接加入群【TesterHome 杭州沙龙群】:427927563 qq 群

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册