Python 接口自动化Jsonpath 应用及断言

jsonpath 的应用:

首先我们要知道,使用 jsonpath 之前我们要有一个对应的数据去进行对应的操作,比如我们工作中会得到的响应数据,基于我们的响应数据 我们要对应的提取 比如 token msg.....所以我们就会用到它 jsonpath。

那在Python 中 我们需要先按转第三方包 安装命令 pip install jsonpath

也可以点击直接安装

真是尴尬 安装失败了

为什么呢?我看了文档 一顿操作猛如虎 发现是  jsonpath 不兼容python 版本,我下载的 python 是3.12 版本不兼容,找了好多方法 累了。。。直接下载个低版本的 python 吧

然后执行命令pip install jsonpath

如果安装成功运行一段代码 返回北京就是正确的啦

import jsonpath
data = {
    'name':'xiaowang',
    'age':'28',
    'city':'北京'
}
ret = jsonpath.jsonpath(data,'$.city')
print(ret)

那我们继续往下 刚才我输入了import jsonpath ,os快捷键进入 command+鼠标点击 jsonpath

我们可以看见是个 py 文件, 我们import jsonpath是导入我们的模块,我们需要通过这个模块来调用这个方法,我们调用方法是 jsonpath.jsonpath。

 jsonpath.jsonpath(data,'$.city')    data(需要提取的数据对象,提取的表达式)

提取的数据对象就是我们的响应数据,提取的表达式 jsonpath 是以$开始

那具体的表达式要怎么写呢 刚开始不熟悉的小伙伴可以用 json 解析器 会帮我自动生成 json 格式

重点⚠️  jsonpath 返回的数据都是列表格式

$:根节点 最外层的花括号

.  :获取子节点

.. :获取所有符合条件的内容(不分层级)

我们现在知道最基本的 那就来试一下 没有数据的可以复制粘贴一下 json  

{
	"firstName": "John",
	"lastName": "doe",
	"age": 26,
	"address": {
		"streetAddress": "naist street",
		"city": "Nara",
		"postalCode": "630-0192"
	},
	"phoneNumbers": [{
			"abc": "uuu",
			"Code": "630-0292",
			"type": "iPhone",
			"number": "0123-4567-8888"
		},
		{
			"type": "home",
			"number": "0123-4567-8911"
		},
		{
			"type1": "jia",
			"number": "0123-4567-8912"
		},
		
		{
			"type2": "jia22",
			"number": "0123-4567-8913"
		},
		{
			"type2": "jia33",
			"number": "0123-4567-8914"
		}
	]
}

那如果两个 type 我们想获取第一个要怎么写呢 用下标的方法来获取 从 0 开始

* :获取所有的元素节点

[index] :通过下标来获取

    [,] :表示多个结果的选择

[start:end] :指定范围内的元素 左闭右开 不包含 end 比如有 5 条数据我们[0:4] 就说明是从 0-3

?(@.a == b) 表示过滤操作 @代表当前节点

知道了 jsonpath 的基本运用 那我们就可一开始浅写一点代码啦

import jsonpath
data = {
	"firstName": "John",
	"lastName": "doe",
	"age": 26,
	"address": {
		"streetAddress": "naist street",
		"city": "Nara",
		"postalCode": "630-0192"
	},
	"phoneNumbers": [{
			"abc": "uuu",
			"Code": "630-0292",
			"type": "iPhone",
			"number": "0123-4567-8888"
		},
		{
			"type": "home",
			"number": "0123-4567-8911"
		},
		{
			"type1": "jia",
			"number": "0123-4567-8912"
		},

		{
			"type2": "jia22",
			"number": "0123-4567-8913"
		},
		{
			"type2": "jia33",
			"number": "0123-4567-8914"
		}
	]
}
ret = jsonpath.jsonpath(data,'$.age')
print(ret)

结果也跟我们之前一样,看返回结果 还是那句话 返回数据一定是个列表!!!

ret = jsonpath.jsonpath(data,'$.phoneNumbers')
print(ret)
[[{'abc': 'uuu', 'Code': '630-0292', 'type': 'iPhone', 'number': '0123-4567-8888'}, {'type': 'home', 'number': '0123-4567-8911'}, {'type1': 'jia', 'number': '0123-4567-8912'}, {'type2': 'jia22', 'number': '0123-4567-8913'}, {'type2': 'jia33', 'number': '0123-4567-8914'}]]

看!!前面是列表套列表  用我们学到的

ret = jsonpath.jsonpath(data,'$.phoneNumbers.*')
print(ret)
[{'abc': 'uuu', 'Code': '630-0292', 'type': 'iPhone', 'number': '0123-4567-8888'}, {'type': 'home', 'number': '0123-4567-8911'}, {'type1': 'jia', 'number': '0123-4567-8912'}, {'type2': 'jia22', 'number': '0123-4567-8913'}, {'type2': 'jia33', 'number': '0123-4567-8914'}]

我们现在有 5 组数据 我们可以用下标索引的方式来看一下第一组和最后一组

print(ret[0])
print(ret[-1])
{'abc': 'uuu', 'Code': '630-0292', 'type': 'iPhone', 'number': '0123-4567-8888'}
{'type2': 'jia33', 'number': '0123-4567-8914'}

jsonpath 提取数据的场景

需要断言:看某个响应字段是不是我们想要的

接口关联:提取当前接口的响应数据,作为下一个接口的请求数据

我们先讲第一个 断言

断言的关键字是 assert

怎么用呢 举例:

assert表达式,当不满足条件的时候提示信息

assert 3 == 3,“两者之间不相等”

如果通过断言则正常运行没有提示,断言只有在条件不满足时才会提示信息

我们可以来简单运行一下代码,因为 1=1 所以不会出来提示信息

assert  1 == 1,'两者之间不相等'

那我们把 1 改成 2 在运行一下

assert  1 == 2,'两者之间不相等'

断言也可以不是==  也可以是> 或者< 逻辑运算符都可以进行运用

那我们现在知道了 post 请求 知道了 jsonpath 知道了断言 那我们来代码写一写

先登录接口 拿到返回数据 msg

在对 msg 来进行断言


import requests
import json
import jsonpath

url = "http://www.baidu.com/php?s=/login"
yu_pramas = {
    "application": "app",
    "application_client_type": "weixin"
}
data = {
    'accounts': 'nihao',
    'pwd': '123ujgh',
    'type': 'username'
}
header = {
    'Content-Type': 'application/json'
}
new_data = json.dumps(data)
ret = requests.post(url, params=yu_pramas, data=new_data, headers=header)
print(ret.text)
mag_ret = jsonpath.jsonpath(ret.json() ,'$.msg')
print("当前提取的数据为:",mag_ret)
assert mag_ret == "登录成功",f"错误,我们当前返回的值是:{mag_ret}"

看运行结果

这时候我们看  当前提取的数据为: ['登录成功']

这是个列表啊 我们用下标索引的方法来取一下值

mag_ret = jsonpath.jsonpath(ret.json() ,'$.msg')[0]

那我们下来跑一下看结果

如果我们改一下密码再看一下 

断言就说到这里啦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值