requests 中响应正文 json 和响应正文 text 不同:
text 是一个字符串
json 是一个 json 对象
对于 json 对象,responses-validator 可以进行更灵活的断言,
比如只对其中的部分字段进行断言,或者只对 json 对象的 schema 断言
1. 断言部分字段
首先,json 如 text、headers 一样,断言均是可选的,可以留空。
其次,json 响应中字段较多,可以只对部分字段进行断言
假设某接口返回 JSON 如下
其中age字段表示年龄,其值会随着时间动态变化
在编写断言时,可仅对其中 2 个字段进行断言
yaml 写法如下
执行结果如下:
图 1. 对于 JSON 部分字段断言
2. 断言完全匹配
如果期望接口返回只包含指定字段,而不包括 age 字段
在 responses-validator 可以使用【same】模式,则只有接口返回下面一模一样的内容才会断言成功,
多了字段或少了字段,或字段内容不一样,均会失败
这里一模一样特指:字段名称及字段值,字段顺序无需一样
在这个例子中,如果接口返回以下内容,则断言通过
如果接口返回以下内容,则断言失败
{ "name": "sanmu" # 失败:缺少email字段}
3. 断言 schema 匹配
在前文中,接口响应的 json 正文中,动态变化的字段被忽略,从而使其他字段能够顺利断言
那么,可不可以对对动态字段也进行断言呢?
例如,虽然我们不知道每次响应age字段返回的数字多少,
但是我们至少知道:
字段的名称是age
字段的类型是int
这些信息称之为schema,
在 responses-validator 可以使用【schema】模式,断言 JSON 的字段和类型
具体示例:
#tests/test_json_schema.yamltest_name: 断言json响应schema
steps: - request: method: get url: https://api.tttt.one/rest-v1/get_user
- response: status_code: 200 json: value: name: abc # 断言包含name字段,并且是字符类型 age: 0 # 断言包含age字段,并且是数字类型 email: # 断言包含email字段,并且是字符类型 mode: schema # 断言模式 msg: 响应格式不正确
执行结果如下:
图 2. 对 JSONSchema 进行断言
注意,【schema】模式下不会判断字段的值。
通常用于验证响应是否符合接口文档中的示例,无法验证具体业务中的数据正确性
如果对数据值进行断言,请务必同时使用其他模式
4. 断言 jsonpath 匹配
默认的【glob】模式已经可以对部分字段进行准确断言,
但是在多层嵌套、条件筛选等复杂模式下不够简单直观,编写断言时容易失误
在 responses-validator 可以使用【jsonpath】模式,设置多个 jsonpath 表达式,及其预期结果
假设接口返回 JSON 如下
如果要断言 age>18 的名字中只有 sanmu,可以如此编写 yaml 用例
#tests/test_json_jsonpath.yamltest_name: 断言json响应jsonpath
steps: - request: method: get url: https://api.tttt.one/rest-v1/get_user_list
- response: status_code: 200 json: value: # 期望结果,如果存在期望外的字段则失败 $[?(@.age > 18)].name: [sanmu, ] mode: jsonpath # 断言模式 msg: 响应数据不正确
注意,jsonpath 的返回值是列表,所有预期结果也应该是列表,否则会被强制转为列表
所以也可简写为
- response: status_code: 200 json: value: # 期望结果,如果存在期望外的字段则失败 $[?(@.age > 18)].name: sanmu # 会自动转为[sanmu, ] mode: jsonpath # 断言模式 msg: 响应数据不正确
执行结果如下
图 3. 两种 JSONPATH 断言效果相同
领取专属 10元无门槛券
私享最新 技术干货