阅读 32
Python3接口自动化测试框架之jsonpath参数提取

Python3接口自动化测试框架之jsonpath参数提取

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

python中的jsonpath与java中的jsonpath几乎是一样一样的

看过jsonpath部分源码,其中jsonpath方法返回的是list类型,为空则返回False;
so,具体提取json对象参数的值都需要使用index索引取值引用。

tips:list支持索引取值、切片取值、len长度计算
复制代码
  • 示例给出一个json对象
dic={
    "code": 0,
    "msg": "OK",
    "data": [{
        "id": 10086,
        "leave_amount": 86,
        "mobile_phone": "13800138000",
        "reg_name": "大柠檬",
        "type": 1,
        "reg_id":"123",
        "token_info": {
            "token_type": "Bearer",
            "token": "10086的token"
        }
    }, {
        "id": 10011,
        "leave_amount": 11,
        "mobile_phone": "13800138001",
        "reg_name": "小柠檬",
        "type": 11,
        "token_info": {
            "token_type": "Bearer",
            "token": "10011的token"
        }
    },{
        "id": 123456,
        "leave_amount": 56,
        "mobile_phone": "13800138002",
        "reg_name": "酸柠檬",
        "type": 33,
        "token_info": {
            "token_type": "Bearer",
            "token": "123456的token"
        }
    }],"token":"第一层的token"
}
复制代码
  • 在接口测试过程中,需要做到参数关联,那么如何提取想要的参数
思路:requests响应的报文,可以根据实际返回数据类型;json()
那么你想要哪一个参数就需要使用dict类型的key进行取值:res["token"]

那么问题来了:
如果返回的json对象层级较深、结构复杂,那么如何才能精确定位找到关键key的值?

tips:dict类型取值建议使用get(key)方法,不存在的key不会报错返回none,亦可以作为一个bool条件进行判断使用
复制代码
  • 演示jsonpath如何便利解析json对象
import jsonpath

# 正常取值(最外层),任何时候匹配返回的值是list
res=jsonpath.jsonpath(dic,"msg")[0]
print("msg匹配msg的值:{}".format(res))
res=jsonpath.jsonpath(dic,"$.msg")[0]
print("$.msg匹配msg的值:{}".format(res))

# 多层级取值$..所有对象key的值都可以
res=jsonpath.jsonpath(dic,"$..token")
print("$..token匹配json对象所有token的值:{}".format(res))
res=jsonpath.jsonpath(dic,"$.data[*]..token")
print("$.data[*]..token匹配data中所有token的值:{}".format(res))

# int类型的==比较不用引号,字符串类型的才需如此''
res=jsonpath.jsonpath(dic,"$.data[?(@.id==10011)]..token")[0]
print("$.data[?(@.id=='10011')]..token匹配data中id=10011的token值:{}".format(res))

# 数组对象取值,数组下标,
res=jsonpath.jsonpath(dic,"$.data[0].leave_amount")[0]
print("$.data[0].leave_amount匹配第一个data中leave_amount的值:{}".format(res))

# 数组对象取值,数组下标,默认从0开始
res=jsonpath.jsonpath(dic,"$.data[0,2]")
print("$.data[0,2],理解成选择取值:{}".format(res))
res=jsonpath.jsonpath(dic,"$.data[0:3]")
print("$.data[0:3],理解成切片取值:{}".format(res))
res=jsonpath.jsonpath(dic,"$.data[2]")
print("$.data[2],取第3个:{}".format(res))

# 关键字过滤
res=jsonpath.jsonpath(dic,"$..data[?(@.reg_id)]")[0]
print("$..data[?(@.reg_id)]:用reg_id过滤data:{}".format(res))

# 支持条件过滤取值
res=jsonpath.jsonpath(dic,"$..data[?(@.type==1)].reg_name")[0]
print("$..data[?(@.type==1)].reg_name:过滤data中所有的type等于1的reg_name:{}".format(res))

# JSON结构的所有成员。
res=jsonpath.jsonpath(dic,"$..*")
print("$..*:JSON结构的所有成员:{}".format(res))
复制代码
文章分类
后端
文章标签