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

飞狐 · August 24, 2016 · Last by replied at August 26, 2016 · 1637 hits

目前接触及了解到的很多接口测试框架,比较缺乏的一点就是对接口参数异常测试比较薄弱,在此我这边说明下我对参数强度测试的理解及实现;
参数测试要包含:
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 条回复 时间 点赞

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

飞狐 #2 · August 24, 2016 作者

#1楼 @lose 😄😄😄

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

有开源计划吗?

飞狐 #4 · August 25, 2016 作者

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

不错的思路

飞狐 #7 · August 26, 2016 作者

#6楼 @mads 😀 约啥哈?

飞狐 #8 · August 26, 2016 作者

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

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

飞狐 #10 · August 26, 2016 作者

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

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

飞狐 #12 · August 26, 2016 作者

#11楼 @mads 微信群是?

飞狐 #14 · August 26, 2016 作者

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

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

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up