一直在糾結的一個問題:我在公司一開始寫接口測試用例的時候,都是按接口規則,預期值直接從庫裏查數據然後拼接json出來和實際接口返回json進行斷言,但這種方式工作量太大,越到後來我就直接將接口返回值複製粘貼到預期結果裏了。但這種方式我越想越覺得沒有任何意義。我就在想,是不是可以將必須校驗的字段單獨拎出來,然後和預期結果比,基於該思路,我今天想了一個比較json的類。
接口返回的json串是實際結果,我們給的json串是包含我們校驗的key-value,沒必要校驗的key就不寫在json中了。不包含的key必不會影響校驗結果,只有預期的json串中的value值和實際json中的value值匹配不上,纔會返回false。
package com.course.utils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.log4j.Log4j;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@Log4j
public class JsonUtil {
/**
* 判斷實際結果和預期結果是否一致,在預期結果中可以去除不需要驗證的key
*
* @param actualJson
* @param exceptedJson
* @return
*/
public static Boolean cmpJsonObject(JSONObject actualJson, JSONObject exceptedJson) {
List<String> reultList = new LinkedList<>();
for (Map.Entry<String, Object> actualEntry : actualJson.entrySet()) {
for (Map.Entry<String, Object> exceptedEntry : exceptedJson.entrySet()) {
if (actualEntry.getKey().equals(exceptedEntry.getKey())) {
if (!actualEntry.getValue().equals(exceptedEntry.getValue())) {
reultList.add(actualEntry.getKey());
}
}
}
}
if (reultList.size() > 0) {
log.info("共有--->" + reultList.size() + "<---對鍵值對不匹配");
for (String s : reultList) {
log.info(reultList.indexOf(s) + ":");
log.info("實際值:" + actualJson.getString(s));
log.info("預期值:" + exceptedJson.getString(s));
}
return false;
} else {
return true;
}
}
/**
* @param actualJsonArray
* @param exceptedJsonArray
* @return
*/
public static Boolean cmpJsonArray(JSONArray actualJsonArray, JSONArray exceptedJsonArray) {
List<String> reultList = new LinkedList<>();
if (actualJsonArray.size() == exceptedJsonArray.size()) {
for (int i = 0; i < actualJsonArray.size(); i++) {
if (verifyJsonObject(actualJsonArray.getString(i)) && verifyJsonObject(exceptedJsonArray.getString(i))) {
if (!cmpJsonObject(actualJsonArray.getJSONObject(i), exceptedJsonArray.getJSONObject(i))) {
reultList.add(String.valueOf(i));
}
} else {
if (!actualJsonArray.get(i).equals(exceptedJsonArray.get(i))) {
reultList.add(String.valueOf(i));
}
}
}
}
if (reultList.size() > 0) {
log.info("共有--->" + reultList.size() + "<---對鍵值對不匹配");
for (String s : reultList) {
log.info(reultList.indexOf(s) + ":");
log.info("實際值:" + actualJsonArray.getString(Integer.valueOf(s)));
log.info("預期值:" + exceptedJsonArray.getString(Integer.valueOf(s)));
}
return false;
} else {
return true;
}
}
/**
* 校驗是否是json串
*
* @param jsonString
* @return Boolean
*/
private static Boolean verifyJson(String jsonString) {
try {
JSON.parse(jsonString);
return true;
} catch (Exception e) {
return false;
}
}
/**
* 校驗是否是JSONObject類型的json
*
* @param jsonString
* @return Boolean
*/
public static Boolean verifyJsonObject(String jsonString) {
if (!verifyJson(jsonString)) {
return false;
}
try {
JSONObject.parseObject(jsonString);
return true;
} catch (Exception e) {
return false;
}
}
/**
* 校驗是否是JSONArray類型的json
*
* @param jsonString
* @return Boolean
*/
public static Boolean verifyJsonArray(String jsonString) {
if (!verifyJson(jsonString)) {
return false;
}
try {
JSONArray.parseArray(jsonString);
return true;
} catch (Exception e) {
return false;
}
}
}
我使用的如下方法進行測試的
@Test
public void cmpJson() {
String str1 = "json";
String str2 = "json";
JSONObject jsonObject1 = JSONObject.parseObject(str1);
JSONObject jsonObject2 = JSONObject.parseObject(str2);
Assert.assertEquals(java.util.Optional.of(JsonUtil.cmpJsonObject(jsonObject1, jsonObject2)), true);
JSONArray jsonArray1 = new JSONArray();
JSONArray jsonArray2 = new JSONArray();
jsonArray1.add("first");
jsonArray1.add("second");
jsonArray2.add("first");
jsonArray2.add("second");
Assert.assertEquals(JsonUtil.cmpJsonArray(jsonArray1, jsonArray2), java.util.Optional.of(true));
}