JSON Schema 模式是一个词汇表,可用于注释和验证 JSON 文档。在实际工作中,对接口返回值进行断言校验,除了常用字段的断言检测以外,还要对其他字段的类型进行检测。对返回的字段一个个写断言显然是非常耗时的,这个时候就需要一个模板,可以定义好数据类型和匹配条件,除了关键参数外,其余可直接通过此模板来断言,JSON Schema 可以完美实现这样的需求。
JSON schema 官网:
Implementations | JSON Schema
环境准备
安装 JSON Schema 包
- Python 版本
pip install jsonschema
- Java 版本
<dependency> <groupId>io.rest-assured</groupId> <artifactId>json-schema-validator</artifactId> <version>3.0.1</version> </dependency>
JSON Schema 的使用
JSON Schema 模板生成首先要借助于 JSON Schema tool 的网站 JSON Schema Tool json 字符串复制到页面左边,然后点击 INFER SHCEMA,就会自动转换为 schema json 文件类型,会将每个地段的返回值类型都设置一个默认类型,在 pattern 中也可以写正则进行匹配。
image1080×834 132 KB
点击“设置”按钮会出现各个类型返回值更详细的断言设置,这个就是 schema 最常用也是最实用的功能。也可以对每种类型的字段最更细化的区间值校验或者断言,例如长度、取值范围等。
点击复制按钮,可以将生成的 schema 模板保存下来。
实战练习
接下来会发起一个 post 请求,验证响应值中的 url 字段与 origin 字段是否都为 string 类型。
Python版本
import requests from jsonschema import validate def test_schema(): schema = { "type": "object", "properties": { "url": { "type": "string" }, "origin": { "type":"string" } } } r = requests.post("https://httpbin.ceshiren.com/post") validate(instance=r.json(), schema=schema)
如果将 origin 的 type 写成 number ,则会出现报错:
import requests from jsonschema import validate def test_schema(): schema = { "type": "object", "properties": { "url": { "type": "string" }, "origin": { "type":"number" } } } r = requests.post("https://httpbin.ceshiren.com/post") validate(instance=r.json(), schema=schema)
返回报错信息
> raise error E jsonschema.exceptions.ValidationError: 'xxx.xxx.xxx.xxx' is not of type 'number' E Failed validating 'type' in schema['properties']['origin']: E {'type': 'number'}
同理,若将 url 的 type 改为 number,也会有报错提示。
Java 版本
> raise error E jsonschema.exceptions.ValidationError: 'https://httpbin.ceshiren.com/post' is not of type 'number' E Failed validating 'type' in schema['properties']['url']: E {'type': 'number'}
JsonValidator.json 文件中存放校验文件,校验响应值中的 url 字段与 origin 字段是否都为 string 类型,文件内容为:
"type": "object", "properties": { "url": { "type": "string" }, "origin": { "type":"string" } } }
同 Python 版本一致,以下代码校验响应值是否符合 JsonValidator.json 文件中规定的格式要求。
import static io.restassured.module.jsv.JsonSchemaValidator.matchesJsonSchemaInClasspath; import static io.restassured.RestAssured.*; public class Requests { public static void main(String[] args) { //定义请求头信息的contentType为application/json given().when(). post("https://httpbin.ceshiren.com/post"). then().assertThat(). body(matchesJsonSchemaInClasspath("JsonValidator.json")); } }
⬇️ 你好呀,喜欢这篇文章的话记得点个“赞”哦!大家的支持很重要~(*^▽^*) PS:有问题可以联系我们哦~v ceshiren001
>更多技术文章分享和免费资料领取
https://qrcode.ceba.ceshiren.com/link?name=article&project_id=qrcode&from=toutiao×tamp=1659921581&author=QY
,