之前有一篇文章,介绍了如何使用JSONSchema对接口响应进行断言,主要的适用场景是对响应的数据结构进行校验,保证客户端收到的数据结构稳定和合法。今天,介绍使用JSONPath对接口响应的值进行断言方法。

上一篇文章《在接口自动化测试中,如何利用Pytest + JSON Schema 进行接口响应断言》中,介绍了JSON Schema校验接口响应的数据结构的方法。在实际的测试工作中,很多时候是需要对接口的响应数值进行校验的。这时候就不能利用JSON Schema进行校验了,需要借助JSONPath表达式从JSON中抽取数值,进行断言。

通过JSONPath表达式,使得从多层嵌套JSON数据中提取数据变得非常简单。

下面这段数据是从JsonPath的官网https://goessner.net/articles/JsonPath/上摘抄的,假定这是一个接口的response。

{ "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

}

},

"expensive": 10

}

从这个response中,提取所有商品的价格,放到一个列表中,如果使用JSONPath表达式,只需要一行代码:

$.store..price

代表JSON对象的根节点,代表JSON对象的根节点,代表JSON对象的根节点,代表JSON对象的根节点,.store表示根节点下面的store属性,$.store…price则表示根节点下面的store属性下面的所有price属性的值。两个点表示store下面递归查找所有的price属性,因此在这个例子中可以查到所有的book的price和bicycle的price。

一个更简单的办法是从根节点开始递归查找price:

$..price

如果不使用JSONPath,想要获得所有的商品价格,则要写一个循环来读取,可以看出,使用JSONPath从JSON中提取数据变得简单和高效。

接下来看看JSONPath中都有哪些表达式。

01 — JSONPath表达式

JSONPath通过表达式定位JSON中的数据,一共有15个表达式,通过它们的灵活组合,提取JSON中数据非常容易。我们把JSON对象中每一个key都叫做一个属性(property)。下表是所有的JSONPath表达式,及其含义。

以response这个JSON对象为例,通过上面这些表达式的组合来取得值:

表达式

取得的值

$.store.*

response的store属性下的所有对象,是个list,第1个元素book,是一个list,第2个元素是bicycle,是一个对象。

$.store.bicycle.color

response的store属性下bicycle属性的color属性的值,red

$.store..price、$..price

response中所有的price属性的值: [8.95, 8.99, 22.99, 19.95]

$.store.book[*] $..book[*]

response中所有的book对象,是个list

$…book[*].title

response中所有的book对象的title的list:[Sayings of the Century,Moby Dick,The Lord of the Rings]

$…book[0]

response中的第一本书,也是个list:[ { “category”:“reference”, “author”:“Nigel Rees”, “title”:“Sayings of the Century”, “price”:8.95 } ]

$…book[0].title

response中的第1本书的title:“Sayings of the Century”

$..book[0,1].title $..book[:2].title

response中的前2本书的title:[Sayings of the Century, Moby Dick]

$…book[::2].title

response中每一个取一本图书的title

$..book[-1:].title $..book[(@.length-1)].title

response最后1本书的title,是个list:[The Lord of the Rings]

$…book[?(@.author==‘J.R.R. Tolkien’)].title

过滤表达式,作者为’J.R.R. Tolkien’的book的书名

$…[?(@.isbn)]

过滤表达式,所有包含isbn这个属性的对象

$…[?(!@.isbn)]

过滤表达式,所有不包含isbn这个属性的对象

$…book[?(@.price < 10)]

价格低于10的书,是一个对象list

$..book[?(@.price > $.expensive)]

价格比$.expensive高的书,是个list

$..book[?(@.author =~ /.*Tolkien/i)]

作者的名字以Tolkien结尾的书,是个list,大小写敏感

$..book[?(@.category == 'fiction' || @.category == 'reference')]

category为fiction或者reference的书,是个list

通过上面的例子,可以看到还是挺简单的。

02 — 在断言中的应用

依然假定上面的JSON对象是某个接口的response反序列化得到的。接下来,看看在自动化测试中如何利用JSONPath表达式进行断言。

在Python语言中,使用JSONPath需要安装一个第三方库jsonpath。

pip install jsonpath

测试用例1:

验证response中包含’Nigel Rees’, ‘Evelyn Waugh’, ‘Herman Melville’, 'J. R. R. Tolkien’这四位作者的图书。

import jsonpath

def test_authors():

author_list = jsonpath.jsonpath(response, '$.store.book[*].author')

assert author_list == ['Nigel Rees', 'Evelyn Waugh', 'Herman Melville', 'J. R. R. Tolkien']

2. 测试用例2:

验证response中的商品价格包含8.95, 12.99, 8.99, 22.99, 19.95这5种。

def test_all_price():

store_price_list = jsonpath.jsonpath(response, '$.store..price')

# store_price_list = jsonpath.jsonpath(response, '$..price')

assert store_price_list == [8.95, 12.99, 8.99, 22.99, 19.95]

3.测试用例3:

验证response中的第3本图书的书名是Moby Dick。

def test_third_book_title():

book_3 = jsonpath.jsonpath(response, '$.store.book[2]')

assert book_3[0]['title'] == "Moby Dick"

4.测试用例4:

验证response中的最后一本图书的isbn是0-395-19395-8。

def test_last_book_isbn():

last_book_isbn = jsonpath.jsonpath(response, f'$.store.book[-1:].isbn')

# last_book_isbn = jsonpath.jsonpath(response, f'$.store.book[(@.length-1)].isbn')

assert last_book_isbn == "0-395-19395-8"

5.测试用例5:

验证repsonse中前两本书价格之和是8.95 + 12.99

def test_12_books_price():

book_12 = jsonpath.jsonpath(response, '$..book[0,1].price')

assert book_12[0] + book_12[1] == 8.95 + 12.99

6.测试用例6:

验证response中有两本书的价格小于10

def test_2books_cheap_than_10():

book_lg10 = jsonpath.jsonpath(response, '$..book[?(@.price<10)]')

assert len(book_lg10) <= 2

7.测试用例7:

验证response中具有color属性的商品,其color是red

def test_has_color():

colorful_goods = jsonpath.jsonpath(response, '$.store..[?(@.color)]')

assert "red" == colorful_goods[0]['color']

好了就举这些例子吧。更多的例子大家可以参考第一小节JSONPath表达式来尝试。

Python还有一个包叫jsonpath2,用法和jsonpath差不多。大家可以自行尝试,示例代码可以参考:

https://jsonpath2.readthedocs.io/en/latest/_modules/bookstore_test.html#TestBookStore

03 — 总结

本文介绍了JSONPath表达式语法,以及在自动化测试中的应用。使用JSONPath表达式提取JSON数据的数值,非常简介和易懂。推荐大家需要对JSON数据的准确性进行校验时,使用JSONPath表达式。

参考资料

https://goessner.net/articles/JsonPath/

https://www.cnblogs.com/angle6-liu/p/10580792.html

https://support.smartbear.com/alertsite/docs/monitors/api/endpoint/jsonpath.html

https://jsonpath2.readthedocs.io/en/latest/_modules/bookstore_test.html#TestBookStore

原文链接:https://blog.csdn.net/liuchunming033/article/details/106272542

python接口测试非json的断言_荐在接口自动化测试中,如何利用Pytest + JSONPath 进行接口响应断言...相关推荐

  1. 在接口自动化测试中,如何利用Pytest + JSONPath 进行接口响应断言

    之前有一篇文章,介绍了如何使用JSONSchema对接口响应进行断言,主要的适用场景是对响应的数据结构进行校验,保证客户端收到的数据结构稳定和合法.今天,介绍使用JSONPath对接口响应的值进行断言 ...

  2. 技术分享 | 接口自动化测试中如何对xml 格式做断言验证?

    在服务端自动化测试过程中,发起请求之后还需要对响应值进行验证,验证响应信息符合预期值之后,这一条接口自动化测试用例才算完整的通过.所以这一章节,将会讲解在接口自动化测试中,是如何对服务端返回的 XML ...

  3. Jmeter工具中参数化、正则表达式提取器、响应断言的实现

    参数化.正则表达式提取器.响应断言的实现 1.实现参数化 2.正则表达式提取器 3.响应断言 上一篇文章实现了用Jmeter工具实现了新增用户和学员登录两个功能,这篇文章将对前两个功能进行优化. 1. ...

  4. 接口自动化测试实践指导(下):接口自动化测试断言设置思路

    在前篇文章: 接口自动化测试实践指导(中):接口测试场景有哪些 中详细给小伙伴们讲解了一下接口自动化需要做哪些准备工作及接口测试场景有哪些. 本篇文章是最后一篇,主要分享一下接口自动化测试断言设置思路 ...

  5. 20180307:python接口测试时json的传参与解析区分

    女生节也要好好更新^_^ 有关python与json编码请查看上篇:http://www.cnblogs.com/hazelrunner/p/8444744.html 下面来区分,用post请求方法传 ...

  6. python翻页爬豆瓣影评_荐爬虫7_《隐秘的角落》豆瓣影评爬取及可视化分析

    本文源码:百度云 提取码 pra2 影评爬取 豆瓣网有限制,各种类型的评论只可以爬取220条,所以我爬取了好评.一般.差评各220条,共计630条.爬取维度为评论类型.点赞数.评分.发布日期.评论. ...

  7. byte用json存 c++_.NET Core 3.1中的Json互操作最全解读收藏级

    (给DotNet加星标,提升.Net技能) 转自:Ron.Liangcnblogs.com/viter/p/12116640.html 前言 本文比较长,我建议大家先点赞.收藏后慢慢阅读,点赞再看,形 ...

  8. python shell怎么改字体颜色_在shell或者perl中改变字体或背景的颜色

    在shell下提到终端的颜色的时候不得不提到几个提示符变量: PS1:默认提示符,也就是远程登上系统之后,打开终端,我们天天见到的那个熟悉的提示符: [root@vps ~]$echo $PS1 [\ ...

  9. python交互式环境是什么意思_如何在交互式环境中执行 Python 程序

    如何在交互式环境中执行 Python 程序 相信接触过 Python 的小伙伴们都知道运行 Python 脚本程序的方式有多种, 目前主要的方式有: 交互式环境运行命令行窗口运行开发工具上运行等, 其 ...

最新文章

  1. 什么是VMware vSphere
  2. 【世界上最优秀的逆向分析工具】IDA Pro6.1绿色版
  3. 通过设计绿色数据中心寻求循环经济
  4. 《众妙之门——Web用户体验设计与可用性测试》一第2章 在网页设计中通过测量数据优化情感投入2.1 情感应答和行为应答的关系...
  5. 惩罚、补偿、正则化、约束的联系和区别
  6. 5、play中的json数据处理
  7. http_build_query()就是将一个数组转换成url 问号?后面的参数字符串,并且会自动进行urlencode处理,及它的逆向函数...
  8. CentOS 安装jdk1.7 32位
  9. VC++实现全局钩子勾住消息对话框
  10. BXP无盘WINXP优化精华篇(转)
  11. 51单片机入学第七课——矩阵键盘
  12. [Boost.asio] 深入linux网络编程(四):使用asio搭建商用服务器
  13. insert on duplicate key update命令
  14. 【产业互联网周报】房企分拆物业公司上市潮来临,“智慧社区”加码;旷视智慧物流业务定位及战略布局;京东健康与药明康德入股卫宁科技...
  15. UPDATE的两个实例
  16. 2012蓝桥杯省赛真题 鲁卡斯序列
  17. 毕业工作五年的总结和感悟(上)
  18. 【JavaScript】小数点精度问题,小数点后两位toFixed(),把四舍六入五凑偶,修改成四舍五入
  19. table_schem是什么意思
  20. Python三国华容道程序-广度优先

热门文章

  1. php 不是有效的win32,%1不是有效的 win32应用程序(64位转换32位)
  2. java sox语音_Sox语音转换的相关知识
  3. php复制xml文件,PHP_php xml文件操作实现代码(二),复制代码 代码如下:?php //创 - phpStudy...
  4. 廖雪峰python教程在哪看_:廖雪峰python教程在哪
  5. springboot启动不打印日志信息_SpringBoot日志操作【全局异常捕获消息处理--日志控制台输出+日志文件记录】...
  6. mysql问题定位_十、MySQL的SQL优化之定位SQL的问题 - 系统的撸一遍MySQL
  7. oracle nowday,Java MonthDay now()用法及代码示例
  8. php更新svn,利用php进行svn更新的php代码及php执行svn更新注意事项
  9. 875. 爱吃香蕉的珂珂(二分)
  10. dwr和ajax的区别,dwr的ajax实现