本人在使用httpclient做接口功能測試的過程中,有一個需求是驗證字段值是否是數字,我設計的用例格式是一個verify_key對應一個verify_value的格式,經過嘗試和驗證,終於解決了這個問題。數據庫中verify_key值爲int的時候,我就去驗證後面verify_value中的字符是否在相應的json數據中,如果在就去查找後面的值是否是數字,此處不一定是int類型。如果是多個字段使用逗號隔開,不區分中英文逗號,因爲會在程序中做兼容。分享代碼,供大家參考。
// 獲取驗證字段類型
private String getDateType(JSONObject response, String key, String value) {
String value1 = value;// 存放一個value,因爲後面回去value進行編輯
if (key == null || key.isEmpty()) {
return value1;
}
if (key.equalsIgnoreCase("int")) {
if (!response.toString().contains(value1)) {
return author;
}
value = value.replace(",", ",");// 替換掉中文逗號
if (value.indexOf(",") == -1) {// 如果不存在逗號,則直接進入驗證
boolean result = checkNum(response.toString(), value1);
return result ? value1 : author;
} else {// 如果包含逗號,先將中文逗號轉化爲英文都好
List<String> list = new ArrayList<>();// 用list存放獲取到的value中的值
for (int i = 0; i < 10; i++) {// for循環獲取驗證文本
if (value.indexOf(",") == -1) {// 如果已經到頭,則直接賦值並添加list,跳出循環
String key1 = value;
list.add(key1);
break;
}
String key1 = value.substring(0, value.indexOf(","));// 截取字符串
list.add(key1);// 添加list
value = deleteCharFromString(key1 + ",", value);// 刪除截取到的字符串
}
boolean result = true;
for (int i = 0; i < list.size(); i++) {
if (!result) {
break;
}
result = result & checkNum(response.toString(), key);// 遍歷得到最終結果
}
return result ? value1 : author;// 返回值
}
} else {
return getDataContains(response, key, value1);// 如果不是int,則返回getdatevalue()方法的返回值
}
}
最後一個方法是,從json數據中獲取對應值的方法,如果驗證失敗,就會調用驗證包含的方法,如果失敗繼續調用驗證字段值方法,防止一些用例編寫上的錯誤。
其中checknum的方法如下:
public boolean checkNum(String text, String key) {
boolean result = true;
key = "\"" + key + "\"";
String key1 = text;
String key0;
String key2;
while (result) {
if (!key1.contains(key)) {
break;
}
key1 = key1.substring(key1.indexOf(key));
key0 = key1.substring(0, key1.indexOf(","));
key2 = key0.substring(key0.indexOf(":") + 1);
result = isNumber(deleteCharFromString("\"", key2));
key1 = deleteCharFromString(key0, key1);
}
return result;
}
這裏並未使用正則匹配,主要原因兩個,第一我對正則使用並不非常有把握,時間緊,第二,非數字的相應內容並不十分清楚。以後會繼續優化代碼。