安装命令
pip install jsonpath
表达式
import jsonpath
res = jsonpath.jsonpath(obj, expr)
1、返回结果要么是list,要么是False
2、obj 要提取的对象,应为字典类型。报文的格式是json,必须进行数据的转换, 用 json.loads() 将json转换成字典类型
expr jsonpath表达式
jsonpath表达式基本语法
$ 根节点,也是所有JsonPath表达式的开始
. 表示获取子节点
.. 表示获取所有符合条件的内容
* 代表所有的元素节点
[index] 表示迭代器的标示(可以用于处理下标等情况)
[,] 表示多个结果的选择
[start:end] 指定范围内的元素
?(@.property == value) 表示过滤操作 # 比较运算符
@ 表示当前节点
在线解析 http://www.atoolbox.net/Tool.php?Id=792
示例
# 获取根目录下的子字段:获取用户名
$.name
# 获取根目录下的字典中的数据:获取地址中的城市("country": "USA")
$.address.country
# 获取根目录下的列表中的某个数据:获取教育经历
$.education[0]
# 获取根目录下的列表中的所有数据中的某个字段:获取教育经历中的年
$.education[0:].year
# 获取根目录下的列表中满足某个条件的数据:获取教育经历中的年等于2020 的数据,== \!=
$.education[?(@.year==2020)]
# 获取所有的数据
$.*
断言(assert)
断言的基本概念是,在代码中插入一条断言语句,该语句会在运行时进行条件判断,如果条件为假(False),则会触发断言错误,并中断程序的执行。如果条件为 真(True),则程序会继续执行。
assert 1==1 # 如果条件为真(True),则程序会继续执行。
assert 1==2 # 如果条件为假(False),则会触发断言错误,并中断程序的执行。
assert 1==2,"结果错误" # 如果条件为假(False),则会触发断言错误,并中断程序的执行,并打印错误信息
jsonpath断言实例
import requests
import jsonpath
import json
# 案例一:
url = "http://shop-xo.xxxxxx.com/index.php?s=/api/user/login"
public_data = {"application": "app", "application_client_type": "weixin"}
data = {"accounts": "zhousy", "pwd": "123456", "type": "username"}
res = requests.post(url=url, params=public_data, data=data)
# ----------------------------------------
# 获取响应数据
result1 = res.json() # 以字典的格式获取
result2 = res.text # 以文本的格式获取
print(type(result1)) # 字典 <class 'dict'>
print(type(result2)) # 字符串 <class 'str'>
# 实际结果
# 字典格式:直接获取数据
# reality_res= jsonpath.jsonpath(result1, "$.msg")
# 字符串格式:先通过.loads()进行转换
dict_data = json.loads(result2)
reality_res = jsonpath.jsonpath(dict_data, "$.msg")
# 期望结果
desire_res = "登录成功"
# 断言:期望结果 == 实际结果
# assert desire_res == reality_res # 是一个列表需要通过下标获取具体的值
assert desire_res == reality_res[0]
print(reality_res)
接口关联
示例:通过登录接口获取token,用户加入购物车
import requests
import jsonpath
# 案例一:登录接口
url = "http://shop-xo.xxxxxx.com/index.php?s=/api/user/login"
public_data = {"application": "app", "application_client_type": "weixin"}
data = {"accounts": "hami", "pwd": "123456", "type": "username"}
res = requests.post(url=url, params=public_data, data=data)
# ----------------------------------------
# 获取响应数据
result = res.json()
print(f"响应结果是:{result}")
# 期望结果
desire_res = "登录成功"
# 实际结果
reality_res = jsonpath.jsonpath(result, "$.msg")
# 断言:期望结果 == 实际结果
# assert desire_res == reality_res # 是一个列表需要通过下标获取具体的值
token = jsonpath.jsonpath(result, "$.data.token")
print(f"获取到的token值为:{token}")
assert desire_res == reality_res[0]
# 案例二:加入购物车
url = "http://shop-xo.xxxxxx.com/index.php?s=/api/cart/save"
# public_data = {"application": "app", "application_client_type": "weixin", "token":
"8ae1ce79ed621a991a5e53ba9f96bfd3"}
public_data = {"application": "app", "application_client_type": "weixin", "token":
token}
data = {
"goods_id": "11",
"spec": [
{
"type": "尺寸",
"value": "M"
}
],
"stock": "10"
}
res = requests.post(url=url, params=public_data, data=data)
print(f"请求的url是:{res.url}")
# 获取响应数据
result = res.json()
print(f"响应结果是:{result}")
# 期望结果
desire_res = "加入成功"
# 实际结果
reality_res = jsonpath.jsonpath(result, "$.msg")
assert desire_res == reality_res[0]
标签:断言,url,res,接口,reality,获取,jsonpath,data
From: https://blog.csdn.net/weixin_46337259/article/details/142388612