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