• python-json校验-jsonpath


    本文为在霍格沃兹测试开发学社中学习到的一些技术,写出来分享给大家,希望有志同道合的小伙伴可以一起交流技术,一起进步~

    霍格沃兹启发

    技术分享 | 接口自动化测试如何搞定 json 响应断言?

    背景

    在进行接口自动化测试的时候,对响应结果进行校验,基本上都是对json数据的校验,响应内容十分复杂,当然验证也是一个很庞大的工程 ,不过都是可以通过jsonpath 解决。

    JSONPath 提供了强大的 JSON 解析功能,可以更便捷灵活的用来获取对应的 JSON 内容。

    表示法:

    JSONPath 有两种表示方式, 可以使用表示法,也可以使用括号表示法
    点表示法 例子:$.store.book[0].title
    括号表示法 例子:$['store']['book'][0]['title']

    官方帮助文档

    jsonpath的语法:

    语法描述
    $根对象/元素
    @当前对象/元素
    . 或者 []子运算符,匹配下级元素
    ..递归下降,递归方式匹配所有子元素
    *通配符。所有对象/元素,无论其名称
    []下标运算符,jsonpath 从0开始
    [,]连接的操作符,多个结果拼接成列表返回
    [开始:结束:步骤]从 ES4 借来的数组切片运算符。
    ?()应用过滤器(脚本)表达式。
    ()脚本表达式,使用底层脚本引擎。

    示例:

    { "store": {
        "book": [ 
          { "category": "reference",
            "author": "Nigel Rees",
            "title": "Sayings of the Century",
            "price": 8.95
          },
          { "category": "fiction",
            "author": "Evelyn Waugh",
            "title": "Sword of Honour",
            "price": 12.99
          },
          { "category": "fiction",
            "author": "Herman Melville",
            "title": "Moby Dick",
            "isbn": "0-553-21311-3",
            "price": 8.99
          },
          { "category": "fiction",
            "author": "J. R. R. Tolkien",
            "title": "The Lord of the Rings",
            "isbn": "0-395-19395-8",
            "price": 22.99
          }
        ],
        "bicycle": {
          "color": "red",
          "price": 19.95
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    jsonpath结果备注
    $.store.book[*].author所有书籍的作者
    $..author所有的作者
    $.store.*商店下的所有元素/对象,包括书籍和自行车
    $.store..price商店里所有元素/对象的价格
    $..book[2]下标从0开始,第3本书
    $..book[(@.length-1)]按顺序排列最后一本书用到了()和@两个语法
    $..book[-1:]按顺序排列最后一本书用到了[]数组下标切片
    $..book[0,1]第1本书和第2本书,前两本书
    $..book[:2]第1本书和第2本书,前两本书$…book[0:2] ,从0开始,0 1,前两本书
    $..book[?(@.isbn)]有isbn字段的所有书籍
    $..book[?(@.price<10)]所有价格小于10的书籍
    $..*json结构的所有元素

    实战

    安装jsonpath

    pip3 install jsonpath
    
    • 1

    以网上一个开源的获得天气的API为例子:

    def test_get_json(self):
            r = requests.get("http://t.weather.sojson.com/api/weather/city/101191102")
            print(r.text)
            r_json = r.json()
            # 用点方法来获得notice的内容
            yesterday = jsonpath(r_json, "$.data.yesterday.notice")  
            print(yesterday)
            # 获得aqi=15 的forecast元素
            aqi = jsonpath(r_json, "$..forecast[?(@.aqi==15)]")
            print(aqi)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    当不知道有jsonpath这个神器的时候,我是通过遍历一个个元素,然后再去比对具体的字段信息,比如下方:获得duration 超过7000 的api信息

    {
    	"apis": [{
    		"path": "/path",
    		"duration": 7890
    	}, {
    		"path": "/path",
    		"duration": 6890
    	}, {
    		"path": "/path",
    		"duration": 5890
    	}]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    通过遍历的方式获得:

    apis = '{"apis":[{"path":"/path","duration":7890},{"path":"/path","duration":6890},{"path":"/path","duration":5890}]}'
    print(json.loads(apis))
    apis_json = json.loads(apis)
    # 一个个遍历
    api_duration = []
    for api in apis_json["apis"]:
       duration = api["duration"]
       if int(duration) > 7000:
           print(str(duration))
           api_duration.append(api["path"])
    print(api_duration)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    通过jsonpath获得

    #jsonpath 更简单
    api_duration2 = jsonpath(apis_json, "$.apis[?(@.duration>7000)].path")
    print(api_duration2)
    
    • 1
    • 2
    • 3

    只需Docker,环境问题再也不是测开路上的『坑』_霍格沃兹测试开发学社的博客-CSDN博客

  • 相关阅读:
    Golang 基础二
    【前端】使用promise解决地狱回调问题
    HIve数仓新零售项目DWS层的构建(Full join)模型
    超图iServer rest服务之最佳路径分析
    CentOS7 下载安装卸载 Docker——Docker启动关闭
    js 数组与对象相互转换
    【云原生 一】 CRI、OCI、containerd和CRI-O、runc
    基于springboot实现数据可视化
    渐变圆角边框css
    聊天室(二)__ unipush 推送实现详细教程
  • 原文地址:https://blog.csdn.net/qq_15283475/article/details/126838482