接口自动化-数据驱动-断言

需求

        实现一个方法,可以根据预期的期望值(类型json)去断言实际值(json),期望值需要高可配。其中jsonarray的处理花了点时间。


例子

String except_value1="{"a":1}";

String actual_value1="{"a":1,"b":2}";

匹配!

String except_value2="{"list":[{"a":1}]}";

String actual_value2="{"list":[{"a":1},{"b":2}]}";

匹配!

String actual_value3="{"list":[{"a":1,"lista":[{"a":2},{"b":3}]},{"b":2}]}";

String actual_value14="{"list":[{"a":1,"lista":[{"a":2},{"b":3,"c":4}]},{"b":2}]}";

匹配!

反过来就不匹配了~



思路

        循环期望值:

                如果是jsonNull:

                            Assert;

                如果是JsonObject:

                            递归;

                如果是JsonArray:

                            迭代期望值中的元素:

                                    迭代实际值中的元素:

                                            递归;

                                            如果实际值列表又一个元素符合期望值当前元素:

                                                    break;

                                    如果没有一个符合:

                                            该期望值元素校验不通过;

                如果是JsonPrimitive:

                                如果是数组中的JsonPrimitive:

                                            标记断言结果

                               否则:直接Assert;

        主要用了递归的思路



代码:


import com.google.gson.*;

import net.sf.json.JSONArray;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.junit.Assert;

import java.util.Iterator;

import java.util.Map;


/**

* @author wj

* @date 2020-11-23

*/

public class DAssertUtil {

private static final Loggerlogger = LoggerFactory.getLogger(DAssertUtil.class);

    public DAssertUtil() {

}

public static void DAssert(String ex,String ac){

Assert.assertTrue(ex+"与"+ac+"校验失败",assertJson(ex,ac));

    }

/**

*/

    public static boolean assertJson(String ex,String ac){

boolean result=true;

        JsonElement exJE =new JsonParser().parse(ex);

        JsonElement acJE =new JsonParser().parse(ac);

        if (exJE.isJsonObject()&&acJE.isJsonObject()) {

JsonObject exJO = exJE.getAsJsonObject();

            JsonObject acJO = acJE.getAsJsonObject();

            result=assertJson(exJO,acJO,result,false);

            //传入的还是一个json数组

        }else if (exJE.isJsonArray()&&acJE.isJsonArray()){

//todo

            JsonArray jsonArray = exJE.getAsJsonArray();

            Iterator iterator = jsonArray.iterator();

            while (iterator.hasNext()) {

JsonElement jsonElement1 = iterator.next();

                try {

jsonElement1.getAsJsonObject();

                }catch (IllegalStateException ie) {

assertJson(jsonElement1.getAsString(), acJE.getAsString());

continue;

                }

JsonArray acJsonArray = acJE.getAsJsonArray();

                Iterator acIterator = acJsonArray.iterator();

                boolean res1=false;

                while (acIterator.hasNext()){

res1=res1||assertJson(jsonElement1.getAsJsonObject(),acIterator.next().getAsJsonObject(),result,true);

                }

result=res1;

            }

//assertContainArray(JSONArray.fromObject(ex),JSONArray.fromObject(ac));

        }else if (exJE.isJsonPrimitive()&&acJE.isJsonPrimitive()){

System.out.println("please check the json format!");

        }else if (exJE.isJsonNull()){

Assert.assertTrue(acJE.isJsonNull());

        }

else {

Assert.assertFalse("两者格式不对应",false);

        }

return result;

    }

/**

* 判断

* */

    public static boolean assertJson(JsonObject exJO,JsonObject acJO,boolean result,boolean isArray){

for (Map.Entry object : exJO.entrySet()){

String key = object.getKey();

            JsonElement value = object.getValue();

            result=result&&acJO.has(key);

            if (value.isJsonNull()){

//todo

                result=result&&acJO.get(key).isJsonNull();

continue;

            }

else if (value.isJsonObject()){

//todo

                //递归JsonObject

                result=result&&assertJson(value.getAsJsonObject(),acJO.get(key).getAsJsonObject(),result,false);

                //如果是JsonArray数组则迭代,然后进行递归

            }else if (value.isJsonArray()){

//todo

                JsonArray jsonArray = value.getAsJsonArray();

                Iterator iterator = jsonArray.iterator();

                while (iterator.hasNext()) {

JsonElement jsonElement1 = iterator.next();

                    try {

jsonElement1.getAsJsonObject();

                    }catch (IllegalStateException ie) {

result=assertJson(jsonElement1.getAsString(), acJO.get(key).toString());

continue;

                    }

//如果实际值不是array,就转成array

                    JsonArray acJsonArray =new JsonArray();

                    boolean res2=false;

                    if (!acJO.has(key)){

res2=res2||acJO.has(key);

                        result=result&&res2;

continue;

                    }

if(!acJO.get(key).isJsonArray()){

jsonArray.add(acJO.get(key));

                    }

else {

acJsonArray = acJO.get(key).getAsJsonArray();

                    }

Iterator acIterator = acJsonArray.iterator();

                    while (acIterator.hasNext()){

JsonElement jsonElement2 = acIterator.next();

                        res2=res2||assertJson(jsonElement1.getAsJsonObject(),jsonElement2.getAsJsonObject(),true,true);

                        if(res2){

break;

                        }

}

if(!res2){

Assert.assertTrue("key["+key+"]下元素值为:"+jsonElement1.toString()+"校验不通过",false);

                    }

result=result&&res2;

                }

}

else if (value.isJsonPrimitive()){

//todo

                try {

JsonElement element =new JsonParser().parse(value.getAsString());

                    if (element.isJsonNull()){

Assert.assertTrue("["+key+"] ex:"+element+" ac:"+acJO.get(key).getAsString(),new JsonParser().parse(acJO.get(key).getAsString()).isJsonNull());

                    }else if (element.isJsonObject()) {

assertJson(value.getAsJsonObject(),acJO.get(key).getAsJsonObject(),result,false);

                    }else if (element.isJsonPrimitive()) {

//JsonPrimitive jsonPrimitive = element.getAsJsonPrimitive();

                        if(!isArray){

Assert.assertEquals(value,acJO.get(key));

                        }

else {

result=result&&(value.equals(acJO.get(key)));

                            if(!result){

return result;

                            }

}

}else if (element.isJsonArray()) {

JsonArray jsonArray = element.getAsJsonArray();

                        Iterator iterator = jsonArray.iterator();

                        while (iterator.hasNext()) {

return assertJson(iterator.next().getAsJsonObject(),acJO.get(key).getAsJsonObject(),result,true);

                        }

}

}catch (Exception e){

if(!isArray){

Assert.assertEquals(value,acJO.get(key));

                    }

else {

result=result&&(value.equals(acJO.get(key)));

                        if(!result){

return result;

                        }

}

logger.error(e.toString());

                }

}

}

return result;

    }

public static void main(String[] args) {

String a="{\"a\":\"\"}";

        String b="{\"a\":1,\"b\":2}";

        String lista="{\"list\":[{\"a\":\"\"}]}";

        String listb="{\"list\":[{\"a\":1},{\"b\":2}]}";

        String q="{\"list\":[{\"a\":1,\"lista\":[{\"a\":2},{\"b\":3}]},{\"b\":2}]}";

        String p="{\"list\":[{\"a\":1,\"lista\":[{\"a\":2},{\"b\":3,\"c\":4}]},{\"b\":2}]}";

        DAssert(a,b);

        DAssert(b,a);

        DAssert(q,p);

        DAssert(p,q);

        DAssert(lista,listb);

        DAssert(listb,lista);

        DAssert(a,b);

    }

}

你可能感兴趣的:(接口自动化-数据驱动-断言)