专栏首页从零开始学自动化测试python接口自动化33-json解析神器jsonpath

python接口自动化33-json解析神器jsonpath

前言

做接口测试的时候,大部分情况下返回的是json数据,我们需要对返回的json断言。 当返回的数据量比较大,并且嵌套的层级很深的时候,很多小伙伴不会取值,往往在返回结果取值上浪费很多时间,于是就有了 jsonpath 解析库,专门解决 json 路径深,取值难的问题。

字典取值

对接口返回的接口,转成 dict 类型,通过字典键值对取值

# 作者-上海悠悠 QQ交流群:717225969
# 返回结果,这里是dict
result = {
    "code": 0,
    "data": [
        {
            "age": 20,
            "create_time": "2019-09-15",
            "id": 1,
            "mail": "283340479@qq.com",
            "name": "yoyo",
            "sex": "M"
        },
        {
            "age": 21,
            "create_time": "2019-09-16",
            "id": 2,
            "mail": "123445@qq.com",
            "name": "yoyo111",
            "sex": "M"
        }
    ],
    "msg": "success!"
}

# 字典取值断言
assert result["code"] == 0
assert result["msg"] == "success!"
assert result["data"][0]["name"] == "yoyo"

当层级越来越深的时候,会发现取值变得困难,并且list里面的内容往往不知道是第几个 比如我想判断返回的结果里面有没有 "name": "yoyo" 并且你不知道它是 data 列表中的第几个,这种情况断言就写的很复杂了

正则取值

比如我想判断返回的结果里面有没有 "name": "yoyo" 并且你不知道它是 data 列表中的第几个,这种情况断言就写的很复杂了。 可以用万能的正则取值,正则只能是针对字符串取值,dict 对象先转 json 字符串。

import re
import json
# 作者-上海悠悠 QQ交流群:717225969

# 返回结果,这里是dict
result = {
    "code": 0,
    "data": [
        {
            "age": 20,
            "create_time": "2019-09-15",
            "id": 1,
            "mail": "283340479@qq.com",
            "name": "yoyo",
            "sex": "M"
        },
        {
            "age": 21,
            "create_time": "2019-09-16",
            "id": 2,
            "mail": "123445@qq.com",
            "name": "yoyo111",
            "sex": "M"
        }
    ],
    "msg": "success!"
}

# 断言data中包含"name": "yoyo"
result_to_json = json.dumps(result)
print(result_to_json)       # 先转json
# 方法1 正则取值
res = re.findall('"name": "(.+?)"', result_to_json)  # 正则从json中取值
print(res)
assert "yoyo" in res

# 方法2 直接判断包含
assert '"name": "yoyo"' in result_to_json

jsonpath 解析

接下来讲一个非常强大并且方便的 jsonpath 专门用于 json 解析,解决路径深的老大难问题! 先安装依赖包

pip install jsonpath

学习jsonpath 不得不提到xpath,这两者之间的语法是差不多的

Xpath

JSONPath

描述

/

$

跟节点

.

@

现行节点

/

. or []

取子节点

..

n/a

取父节点 JsonPath不支持

//

..

相对节点 就是不管位置,选择所有符合条件的条件

*

*

匹配所有元素节点

[]

[]

迭代器标示(可以在里面做简单的迭代操作,如数组下标,根据内容选值等)

&#124

[,]

支持迭代器中做多选

[]

?()

支持过滤操作

n/a

()

支持表达式计算

()

n/a

分组,JsonPath不支持

使用示例

$ 是查找的根节点,传参数是python的dict 类型,当查找到的时候返回一个list结果,查找失败的时候返回 False.

import jsonpath
# 作者-上海悠悠 QQ交流群:717225969

result = {
    "code": 0,
    "data": [
        {
            "age": 20,
            "create_time": "2019-09-15",
            "id": 1,
            "mail": "283340479@qq.com",
            "name": "yoyo",
            "sex": "M"
        },
        {
            "age": 21,
            "create_time": "2019-09-16",
            "id": 2,
            "mail": "123445@qq.com",
            "name": "yoyo111",
            "sex": "M"
        }
    ],
    "msg": "success!"
}

msg = jsonpath.jsonpath(result, '$.msg')
print(msg)   # 输出结果 ['success!']
names = jsonpath.jsonpath(result, '$..name')
print(names)   # 输出结果 ['yoyo', 'yoyo111']
no = jsonpath.jsonpath(result, '$..yoyo')
print(no)   # 找不到是结果是 False

这样就可以不用管层级结构也能取值了。

本文分享自微信公众号 - 从零开始学自动化测试(yoyoketang),作者:上海悠悠

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python笔记22-literal_eval函数处理返回json中的单双引号

    在做接口测试的时候,最常见的接口返回数据就是json类型,json类型数据实际上就是字串,通常标准的json格式是可以转化成python里面的对应的数据类型的 ...

    上海-悠悠
  • python测试开发django-70.自定义过滤器filter

    django的模板有很多内置的过滤器,可以满足一些常见的需求,如果有些需求内置过滤器无法满足,那么我们需要自己写一些过滤器了。

    上海-悠悠
  • python测试开发django-67.templates模板变量取值

    django 的模板里面变量取值是通过句点语法来取值,就是一个点(.)符号。取值的对象也可以是字符串,int类型,list列表,字典键值对,也可以是一个类的实例...

    上海-悠悠
  • CTF入门web篇18命令执行无回显的判断方法及dnslog相关例题

    命令执行可能会存在命令执行完没有回显,首先要判断命令是否有执行,可以通过三种方式来判断:延时、HTTP请求、DNS请求。

    牛油果
  • 从应用到内核查接口超时(下)

    接上文 从应用到内核查接口超时(中),查到是因为 journal 导致 write 系统调用被阻塞进而导致超时后,总感觉证据还不够充分,没有一个完美的交待。而且...

    枕边书
  • python笔记22-literal_eval函数处理返回json中的单双引号

    在做接口测试的时候,最常见的接口返回数据就是json类型,json类型数据实际上就是字串,通常标准的json格式是可以转化成python里面的对应的数据类型的 ...

    上海-悠悠
  • 微服务架构 (八): 业务驱动与团队协作微服务粒度设计: 微服务内部的世界

    2016.8.20, 深圳, Ken Fang 在“微服务架构設計 (七): 微服务粒度设计上的核心设计原则与思考的面向” 的一文中, 探讨了从微服务外部的世界...

    Ken Fang 方俊贤
  • Pre and post exit in ABAP method and Nodejs

    Use pre or post exit to put your enhancement to be executed before or after the ...

    Jerry Wang
  • 《coredump问题原理探究》windows版8.7节堆布局heap corruption第二个例子

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuzhina/article/detai...

    血狼
  • K8s 流量复制方案

    测试环境没有真实的数据, 会导致很多测试工作难以展开, 尤其是一些测试任务需要使用生产环境来做时, 会极大影响现网的稳定性。

    腾讯云原生

扫码关注云+社区

领取腾讯云代金券