美文网首页
接口自动化-数据驱动-断言

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

作者: 爱上吃榴莲皮的人 | 来源:发表于2020-12-03 18:09 被阅读0次

    需求

            实现一个方法,可以根据预期的期望值(类型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);

        }

    }

    相关文章

      网友评论

          本文标题:接口自动化-数据驱动-断言

          本文链接:https://www.haomeiwen.com/subject/kzumwktx.html