zoukankan      html  css  js  c++  java
  • 接口自动化测试之预期结果的处理

    在做接口自动化测试时,我们需将测试用例的预期结果与实际结果进行对比,如果一致就认定测试用例通过,不一致就认定失败。而后端接口返回的数据一般是以json的方式返回到前端,那么用jsonpath来做预期结果的处理就很适合了,尤其是对于复杂的json串,jsonpath的优势更明显。

    Jsonpath:看它的名字你就能知道,这家伙和JSON文档有关系,正如XPath之于XML文档一样,JsonPath为Json文档提供了解析能力,通过使用JsonPath,你可以方便的查找节点、获取想要的数据,JsonPath是Json版的XPath。

    JsonPath语法要点:

    • $ 表示文档的根元素

    • @ 表示文档的当前元素

    • .node_name 或 ['node_name'] 匹配下级节点

    • [index] 检索数组中的元素

    • [start:end:step] 支持数组切片语法

    • * 作为通配符,匹配所有成员

    • .. 子递归通配符,匹配成员的所有子元素

    • (<expr>) 使用表达式

    • ?(<boolean expr>)进行数据筛选

    下面分别用Java与Python实现以Jsonpath的方式处理预期结果

    # java代码
    
    import com.alibaba.fastjson.JSONPath;
    import org.junit.jupiter.api.Test;
    import java.util.HashMap;
    import java.util.Map;
     
    public class JSONPathUtil {
       
        public static Boolean checkPoint(String response, String checkData) throws Exception {
            //分隔检查点
            String[] data = checkData.split(";");
            //设置标记
            Boolean flag = false;
     
            Map<String, Object> map = new HashMap<>();
            for (int i = 0; i < data.length; i++) {
                map.put(data[i].split("=")[0], data[i].split("=")[1]);
                System.out.println("检查点" + (i + 1) + "实际结果:" + JSONPath.read(response, data[i].split("=")[0]));
                System.out.println("检查点" + (i + 1) + "预期结果:" + map.get(data[i].split("=")[0]));
                if (JSONPath.read(response, data[i].split("=")[0]) instanceof String) {
                    if (JSONPath.read(response, data[i].split("=")[0]).equals(map.get(data[i].split("=")[0]))) {
                        flag = true;
                    } else {
                        flag = false;
                    }
                } else {
                    if ((JSONPath.read(response, data[i].split("=")[0]).toString()).equals(map.get(data[i].split("=")[0]))) {
                        flag = true;
                    } else {
                        flag = false;
                        break;
                    }
                }
            }
            return flag;
        }
     
        @Test
        public void testCheckPoint() {
            String json = "{"store":{"book":[{"title":"高效Java","price":10.0},{"title":"设计模式","price":12.21},{"title":"重构","isbn":"553","price":8},{"title":"虚拟机","isbn":"395","price":22}],"bicycle":{"color":"red","price":19}}}";
            String params = "$.store.book[0].price=10.0;$.store.book[1].title=设计模式";
            Boolean flag = null;
            try {
                flag = checkPoint(json, params);
            } catch (Exception e) {
                e.printStackTrace();
            }
            if (flag) {
                System.out.println("测试执行结果:成功");
            } else {
                System.out.println("测试执行结果:失败");
            }
        }
    }

    下面是python代码

    import jsonpath
     
     
    def get_instance(value, check):
        flag = None
        if isinstance(value, str):
            if check == value:
                flag = True
            else:
                flag = False
        elif isinstance(value, float):
            if value - float(check) == 0:
                flag = True
            else:
                flag = False
        elif isinstance(value, int):
            if value - int(check) == 0:
                flag = True
            else:
                flag = False
        return flag
     
     
    def check(response, checkPoint):
        c = checkPoint.split(";")
        flag = None
        for i in range(0, len(c)):
            checkPoint_dict = {}
            checkPoint_dict[c[i].split("=")[0]] = c[i].split("=")[1]
            list = jsonpath.jsonpath(response, c[i].split("=")[0])
            value = list[0]
            check = checkPoint_dict[c[i].split("=")[0]]
            print("检查点{}:实际结果:{}, 预期结果:{}".format(i + 1, value, check))
            flag = get_instance(value, check)
        if flag:
            print("测试执行结果:成功")
        else:
            print("测试执行结果:失败")
     
     
    if __name__ == '__main__':
        response = {"store": {"book": [{"title": "高效Java", "price": 10.0}, {"title": "设计模式", "price": 12.21},
                                       {"title": "重构", "isbn": "553", "price": 8},
                                       {"title": "虚拟机", "isbn": "395", "price": 22}],
                              "bicycle": {"color": "red", "price": 19}}}
        checkPoint = "$.store.book[0].price=10.0;$.store.book[1].title=设计模式1";
        check(response, checkPoint)
  • 相关阅读:
    我的2015羊年总结
    谈对象 MVC 和 多端
    自建博客随想录
    梦说1+1等于多少
    多媒体文件格式全解说(下)--图片
    多媒体文件格式全解说(上)--音视频
    做一个“代码模块”交易的网站
    写个屏蔽百度搜索广告的Chrome插件
    Go 系列教程 —— 5. 常量
    Go 系列教程 —— 4. 类型
  • 原文地址:https://www.cnblogs.com/wakey/p/14260956.html
Copyright © 2011-2022 走看看