Python3接口自动化测试框架之参数关联jsonpath

jsonpath与java中的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的值?
  • 演示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))

你可能感兴趣的:(Python3接口自动化测试框架之参数关联jsonpath)