写点什么

软件测试 | JSON 响应断言

  • 2023-02-22
    北京
  • 本文字数:1871 字

    阅读完需:约 6 分钟

1.json 响应断言简介

前面的内容已经简单介绍了如何断言验证接口的响应值。在实际工作中,获取的 json 响应倪荣荣往往十分复杂,面对复杂的 json 响应体,可以用 JSONPath 对其进行解析。JSONPath 提供了强大的解析 json 的功能,可以更便捷、灵活地解析 json 内容。

2.json 响应断言环境准备

Python 版本

pip install jsonpath
复制代码


Java 版本

<dependency>    <groupId>com.jayway.jsonpath</groupId>    <artifactId>json-path</artifactId>    <version>2.6.0</version></dependency>
复制代码

3.XPath 和 JSONPath 语法

XPath 和 JSONPath 语法有很多似之处,但还是有所不同。表 7-1 是 XPath 和 JSONPath 语法的对比。



注:表中的一些语法符号相同,但作用是不一样的具体见表中的描述。

下面是一组 json 结构数据,分别通过 JSONPath 和 XPath 的方式提取出来。


{ "store":{   "book":[   {      "category":"reference",      "author":"Nigel Ress",      "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   } }}
复制代码


表 7-2 列出了 XPath 与 XPath 与 JSONPath 表达式的对比。


实例:想要获取 store 目录下的第一本书 title


(1)XPath 中的语法是:

/store/book[0]/title
复制代码


(2)JSONPath 的语法是:

$.s ore.book[0].itle$['store']['book'][0]['title']
复制代码

4.实战练习

以下是https://ceshiren.com/t/topic/6950.json这个接口的正常响应数据(因响应数据过大,删除了部分内容):

{ 'pos _stream':{    'posts':[      {        'id':17126,        'name':'思寒',        'username':'seveniruby',        'avatar_template':'/user_avatar/ceshiren.com/seveniruby/{size}/2_2.png',        'created_at':'2020-10-02T04:23:30.586z',        'cooked':'<p>一直以来的平均涨薪率在30%以上,这次刷新的记录估计要保持好几年了</p>'        'post_number':6,        'post_type':1,        'updated_at':'2020-10-02T04:23:48.775z',        'reply_to_post_number':None,        'reads':651,        'readers_count':650,        'score':166.6,        'yours':False,        'topic_id':6950,        'topic_slug':'topic',        'display_username':'思寒',        'primary_group_name':'python_12',        //省略       },    ], }, 'timeline_loolup':, 'suggested_topics':, 'tags':[   '精华帖',   '测试开发',   '测试求职',   '测试外包', ], 'id'=6950, 'title':'测试人生 | 从外包菜鸟到测试开发,薪资一年翻三倍,连自己都不相信!(附面试真题与答案)', 'fancy_title':'测试人生 | 从外包菜鸟到测试开发,薪资一年翻三倍,连自己都不敢信!(附面试真题与答案)',}
复制代码


通过使用 JSONPath 表达式获取以上响应内容中 name 字段为“思寒”所对应的 cooked,且其中也包含“涨薪”的数据,并且做断言。


(1)Python 演示代码


使用 JSONPath 表达式实现断言


import requestsfrom jsonpath import jsonpathr = requests.get("https://ceshiren.com/t/topic/6950.json").json()result = jsonpath(r, "$..posts[?(@.name == '思寒')].cooked")[1]assert " 涨薪 " in result
复制代码


(2)Java 演示代码


使用 JSONPath 表达式实现断言


import com.jayway.jsonpath,jsonpath;import org.junit.jupiter.api.Test;import java.util.List;import static io.restassured.RestAssured.given;public class jsonTest{        @Test    void jsonTest(){       //获取响应信息,并转成字符串类型       String res = given().when().              get("https://ceshiren.com/t/topic/6950.json")              .then().extract().response().asString();       //通过JSONPath表达式提取需要的字段       List<String> result = JsonPath.read(res. "$..posts[?(@.name == '思寒')].cooked");       //断言验证       assert result.get(1).contains("涨薪");    }}
复制代码

更多软件测试行业资讯可关注主页了解详情哦~

用户头像

社区:ceshiren.com 微信:ceshiren2023 2022-08-29 加入

微信公众号:霍格沃兹测试开发 提供性能测试、自动化测试、测试开发等资料、实事更新一线互联网大厂测试岗位内推需求,共享测试行业动态及资讯,更可零距离接触众多业内大佬

评论

发布
暂无评论
软件测试 | JSON响应断言_测试_测吧(北京)科技有限公司_InfoQ写作社区