斷言兩個json串(判斷一個json串是否包含另一個)

一直在糾結的一個問題:我在公司一開始寫接口測試用例的時候,都是按接口規則,預期值直接從庫裏查數據然後拼接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));
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章