当前位置: 首页 > news >正文

python-json校验-jsonpath

本文为在霍格沃兹测试开发学社中学习到的一些技术,写出来分享给大家,希望有志同道合的小伙伴可以一起交流技术,一起进步~

背景

在进行接口自动化测试的时候,对响应结果进行校验,基本上都是对json数据的校验,响应内容十分复杂,当然验证也是一个很庞大的工程 ,不过都是可以通过jsonpath 解决。

JSONPath 提供了强大的 JSON 解析功能,可以更便捷灵活的用来获取对应的 JSON 内容。

表示法:

JSONPath 有两种表示方式, 可以使用表示法,也可以使用括号表示法
点表示法 例子:$.store.book[0].title
括号表示法 例子:$['store']['book'][0]['title']

官方帮助文档

jsonpath的语法:

语法描述
$根对象/元素
@当前对象/元素
. 或者 []子运算符,匹配下级元素
递归下降,递归方式匹配所有子元素
*通配符。所有对象/元素,无论其名称
[]下标运算符,jsonpath 从0开始
[,]连接的操作符,多个结果拼接成列表返回
[开始:结束:步骤]从 ES4 借来的数组切片运算符。
?()应用过滤器(脚本)表达式。
()脚本表达式,使用底层脚本引擎。

示例:

{ "store": {
    "book": [ 
      { "category": "reference",
        "author": "Nigel Rees",
        "title": "Sayings of the Century",
        "price": 8.95
      },
      { "category": "fiction",
        "author": "Evelyn Waugh",
        "title": "Sword of Honour",
        "price": 12.99
      },
      { "category": "fiction",
        "author": "Herman Melville",
        "title": "Moby Dick",
        "isbn": "0-553-21311-3",
        "price": 8.99
      },
      { "category": "fiction",
        "author": "J. R. R. Tolkien",
        "title": "The Lord of the Rings",
        "isbn": "0-395-19395-8",
        "price": 22.99
      }
    ],
    "bicycle": {
      "color": "red",
      "price": 19.95
    }
  }
}
jsonpath结果备注
$.store.book[*].author所有书籍的作者
$…author所有的作者
$.store.*商店下的所有元素/对象,包括书籍和自行车
$.store…price商店里所有元素/对象的价格
$…book[2]下标从0开始,第3本书
$…book[(@.length-1)]按顺序排列最后一本书用到了()和@两个语法
$…book[-1:]按顺序排列最后一本书用到了[]数组下标切片
$…book[0,1]第1本书和第2本书,前两本书
$…book[:2]第1本书和第2本书,前两本书$…book[0:2] ,从0开始,0 1,前两本书
$…book[?(@.isbn)]有isbn字段的所有书籍
$…book[?(@.price<10)]所有价格小于10的书籍
$…*json结构的所有元素

实战

安装jsonpath

pip3 install jsonpath

以网上一个开源的获得天气的API为例子:

def test_get_json(self):
        r = requests.get("http://t.weather.sojson.com/api/weather/city/101191102")
        print(r.text)
        r_json = r.json()
        # 用点方法来获得notice的内容
        yesterday = jsonpath(r_json, "$.data.yesterday.notice")  
        print(yesterday)
        # 获得aqi=15 的forecast元素
        aqi = jsonpath(r_json, "$..forecast[?(@.aqi==15)]")
        print(aqi)

当不知道有jsonpath这个神器的时候,我是通过遍历一个个元素,然后再去比对具体的字段信息,比如下方:获得duration 超过7000 的api信息

{
	"apis": [{
		"path": "/path",
		"duration": 7890
	}, {
		"path": "/path",
		"duration": 6890
	}, {
		"path": "/path",
		"duration": 5890
	}]
}

通过遍历的方式获得:

apis = '{"apis":[{"path":"/path","duration":7890},{"path":"/path","duration":6890},{"path":"/path","duration":5890}]}'
print(json.loads(apis))
apis_json = json.loads(apis)
# 一个个遍历
api_duration = []
for api in apis_json["apis"]:
   duration = api["duration"]
   if int(duration) > 7000:
       print(str(duration))
       api_duration.append(api["path"])
print(api_duration)

通过jsonpath获得

#jsonpath 更简单
api_duration2 = jsonpath(apis_json, "$.apis[?(@.duration>7000)].path")
print(api_duration2)

只需Docker,环境问题再也不是测开路上的『坑』_霍格沃兹测试开发学社的博客-CSDN博客

相关文章:

  • 解密Kerberos流量
  • [网鼎杯 2018]Comment
  • Java基础JDK命令行工具(jpd,jstat,jstack,jinfo)
  • 【构建并发程序】8-并发队列之阻塞队列
  • Mysql之用户管理
  • 内网边界代理
  • 【CSS】笔试题精讲
  • Java并发技术基础
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • python打包exe
  • ros rviz显示orb-slam2保存的轨迹
  • Part 10:Pandas的axis参数【详解】--Pandas和Numpy的结合
  • 【Linux集群教程】02 高可用集群
  • 吴恩达对话刘慈欣:让科幻更有勇气,让人工智能更有想象力
  • RESTFULL请求模式
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • echarts的各种常用效果展示
  • exif信息对照
  • extract-text-webpack-plugin用法
  • GraphQL学习过程应该是这样的
  • Java比较器对数组,集合排序
  • JAVA之继承和多态
  • magento 货币换算
  • mysql_config not found
  • PAT A1017 优先队列
  • Spring Boot MyBatis配置多种数据库
  • springMvc学习笔记(2)
  • vue脚手架vue-cli
  • 工程优化暨babel升级小记
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 如何设计一个微型分布式架构?
  • 算法---两个栈实现一个队列
  • 我从编程教室毕业
  • 小而合理的前端理论:rscss和rsjs
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • ​ArcGIS Pro 如何批量删除字段
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • #14vue3生成表单并跳转到外部地址的方式
  • #define、const、typedef的差别
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (C++)八皇后问题
  • (function(){})()的分步解析
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (二)斐波那契Fabonacci函数
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (强烈推荐)移动端音视频从零到上手(上)
  • (四)Linux Shell编程——输入输出重定向
  • (五)MySQL的备份及恢复
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • . ./ bash dash source 这五种执行shell脚本方式 区别