网站首页 > java教程 正文
若服务器返回的Response Body为JSON格式的数据,使用JSON断言来判断测试结果是较好的选择。
首先需要根据JSON Path从返回的JSON数据中提取需要判断的实际结果,再设置预期结果,两者进行比较得出断言结果。下面首先介绍JSON与JSON Path相关的基础知识。
8.1 JSON与JSONPath
什么是JSON
JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式。JSON容易理解,便于阅读和编写;同时计算机也易于解析和生成,所以JSON有广泛的应用。
JSON基于如下两种结构:
1.名称/值对的集合
在各种语言中,这可以作为对象(object)、记录(record)、结构(struct)、字典(dictionary)、哈希表(hash table)、键控列表(keyed list)或关联数组(associative array)来实现。
2.值的有序列表
在大多数语言中,这是以数组(array)、向量(vector)、列表(list)或序列(sequence)的形式实现的。
JSON数据结构
JSON用于描述文本数据结构,有如下形式:
1.对象(object)
对象是一组无序的名称/值对。对象以{(左大括号)开始,以}(右大括号)结束。每个名称后面跟着:冒号,名称/值对之间用逗号分隔。比如:
{“name”:“zhangsan”,“sex”:1,“age”:25}
2.数组(Array)
数组是值的有序集合。数组以[(左中括号)开始,以](右中括号)结束。值之间用逗号分隔。
比如:
{
“man”:[{“name”:“zhangsan”,“sex”:1,“age”:21},
{“name”:“lisi”,“sex”:0,“age”:18},
{“name”:“wangwu”,“sex”:0,“age”:25}]
}
3.值(value)
值可以是字符串、数字、true/false、null、对象或数组。
4.字符串(string)
字符串是由零个或多个Unicode字符组成的序列,用双引号括起来,使用反斜杠转义。字符表示为单个字符串。字符串非常类似于C或Java中的字符串。
5.数字(number)
一系列0-9的数字组合,可以为负数或者小数。还可以用e或者E表示为指数形式;数字非常类似于C或Java数字,但只是不使用八进制和十六进制格式。
6.空白符(whitespace)
可以在任意成对的语法符号之间插入空白符(包括空格、换行符、回车符、横向制表符)。
什么是JSONPath
我们经常使用XPath来分析、转换以及有选择地从XML文档中提取数据。与XPath类似,JOSNPath可以方便从JSON结构中发现和提取数据。
JSONPath中的“根成员对象”总是被称为$,无论它是对象还是数组。JSONPath表达式有“dot–notation”(.号)和“bracket–notation”([]号)两种不同的表示风格。
例如,
$.store.book[0].title or
$[‘store’][‘book’][0][‘title’]
JSONPath语法元素
JSONPath实例
{ “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
}
}
}
8.2 JSON 断言
JSON断言可以对服务器返回的JSON文档进行验证。
JSON断言有两种使用模式:
1.根据JSONPath能否在JSON文档中找到路径;
2.根据JSONPath提取值并对值进行验证。
若文档格式为非JSON则断言失败;
若找不到路径断言失败;
若提取值与预期值不一致断言失败。
配置项
Assert JSON Path exists:
用于断言的JSON元素的路径(JSONPath)。
1.Additionally assert value
是否额外验证根据JSONPath提取的值。
不勾选,验证JSONPath能否在JSON文档中找到路径;
勾选,验证根据JSONPath提取值是否预期。
2.Match as regular expression
预期值是否可以使用正则表达式。
不勾选,预期值不能使用正则表达式表示;
勾选,预期值可以使用正则表达式表示。
Expected Value:
预期值。
1.Expect null
若验证提取的值为null,则勾选此项。
这里有两个地方需要额外注意:
a.验证null值,还是需要勾选“Additionally assert value”,否则验证的是JSONPath能否找到路径;
b.预期值不填表示空字符,与null不等价。
2.Invert assertion(will fail if above conditions met)
若勾选,表示对断言结果取反。
注意:
除了null外,还有一种特殊的值,就是空数组,预期值不能不填,需要设置为:[]
其中[]表示空数组。
8.3 应用案例
这里仍以前面介绍过的查询被购买商品的总金额接口为例来讲述JSON断言的用法。该接口返回的响应数据为JSON,故可以使用JSON断言。
操作步骤
1.对预期结果要验证的项进行参数化
这里验证err_msg,result
将预期结果写入csv文件中
比如:
case_name,goods_id,goods_attr,goods_num,error_msg,rslt
case1,9,226,3,¥6630元
case2,226,1,没有找到指定的商品或者没有找到指定的商品属性。,
case3,9,1,¥2298元
case4,9,226,¥2308元
2.添加JSON Assertion并进行配置
JSON断言每次只能断言一个参数,因此这里需要添加多个JSON断言。
假设对错误消息与商品金额这个两个返回参数值做断言。
使用JSONPath提取错误消息与商品总金额:
{
“err_msg”: “没有找到指定的商品或者没有找到指定的商品属性。”,
“result”: “”,
“qty”: 1,
“err_no”: 1
}
$.err_msg --> 没有找到指定的商品或者没有找到指定的商品属性。
$.result --> 空
JSON断言配置
1.断言错误消息:
2.断言商品总金额:
猜你喜欢
- 2024-11-05 Java 进阶之异常处理(java中异常处理)
- 2024-11-05 为什么Java中的const关键字没有实现?
- 2024-11-05 Spring Boot 内置工具类(springboot 工具类调用service)
- 2024-11-05 深入理解Java:注解(Annotation)基本概念(3-1)
- 2024-11-05 Spring Boot集成validation用于优雅的校验API参数的合法性
- 2024-11-05 java初学者,如何学习java?(java该怎么学)
- 2024-11-05 Nacos网关gateway的断言,自定义断言,过滤器使用
- 2024-11-05 恕我直言,在座的各位根本不会写 Java!
- 2024-11-05 JAVA 命令之标准选项(java怎么选择)
- 2024-11-05 Java锁与线程的那些“不可描述”的事儿
你 发表评论:
欢迎- 最近发表
-
- 五,网络安全IDA Pro反汇编工具初识及逆向工程解密实战
- 「JAVA8」- Lambda 表达式(java lambda表达式原理)
- 深入探讨Java代码保护:虚拟机保护技术的新时代
- Nginx反向代理原理详解(图文全面总结)
- 逆向拆解日本IT,哪些Java技术栈薪资溢价高
- mybatis 逆向工程使用姿势不对,把表清空了,心里慌的一比
- Spring Boot集成ProGuard轻松实现Java 代码混淆, Java 应用固若金汤
- 从 Java 代码逆向工程生成 UML 类图和序列图
- 人与人相处:尊重是标配,靠谱是高配,厚道是顶配
- Windows系统安装日期如何修改(windows10怎么修改安装日期)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)