目的:
我们在接口测试中常会遇到: 被测接口的返回值含有大量key-value节点,且往往有很多value是不固定的,有的是类型不固定、有的是值不固定;这样给接口自动化中的断言带来了巨大困扰,本章提到的jsonschema可以冲在断言最前方,当作第一道网来过滤掉大多数问题;只需几行简单声明,助你轻松实现接口自动化
js和python类型参照表:
js | python |
string | string |
number | int/float |
object | dict |
array | list |
boolean | bool |
null | none |
一. type节点
string
number
object
array
boolean
null
注意
:其中2个类型在书写时要注意,不能带双引号:
- 1.null
//错误例子
{ "type": "null" }
正确匹配举例
{
"address":null
}
- 2.boolean
//错误例子
{ "type": "boolean" }
正确匹配举例
{
"isMan":true,
"isStudent":false
}
二. properties节点——描述可能含有的key,可多不可少
"properties": {
"name": {"type": "string"},
"age": {"type": "number"},
三. propertyNames节点——强调的是匹配key的名字,用正则来匹配
get_propertyNames_demo = {
"type": "object",
"propertyNames": {
"pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
}
}
正确匹配举例
{
"_a_proper_token_001": "value"
}
错误匹配举例
{
"001 invalid": "value"
}
四. dependencies节点——强调依赖关系,举例b依赖于a
- 0.允许没a也没b
- 1.必须有a才能有b
- 2.没有a但出现b是错的
- 3.允许有a没有b:
get_dependencies_demo = {
"type": "object",
"dependencies": {
"b": ["a"],
}
}
“”"举例说明
第0:没a也没b
{
"user": "wenjie",
}
第1:必须有a才能有b
{
"user": "wenjie",
"b": 100,
"a": "10100"
}
第2:没有a但出现b是错的
{
"user": "wenjie",
"b": 100
}
第3:允许有a没有b
{
"user": "wenjie",
"a": "10000"
}
“”"
疑问:如果必须2个都存在呢?下面是a、b相互绑定的写法
get_dependencies_must_demo = {
"type": "object",
"properties": {
"name": {"type": "string"},
"a": {"type": "number"},
"b": {"type": "string"}
},
"dependencies": {
"b": ["a"],
"a": ["b"]
}
}
五. required节点——描述必备的key
get_required_demo = {
"type": "object",
"properties": {
"age": {"type": "number"},
"height": {"type": "number"},
"street_name": {"type": "string"},
"street_type": {"type": "string",
"enum": ["Street", "Avenue", "Boulevard"]
}
},
"required": ["age", "height"] # 必须存在age、height节点,其他无所谓
}
六. enum节点作用解析:
"street_type": {"type": "string",
"enum": ["Street", "Avenue", "Boulevard"]
}
“”“enum 描述了只允许有3种可能[“Street”, “Avenue”, “Boulevard”],如果数据不匹配就是错误的”""
七. 其他限制类型参考
- 1.宽松类型:数字
{"type": "number"}
number1、 -1、 1.01、 2.99792458e8
- 2.严格类型:整数
{"type": "integer"}
integer:-1、10
- 3.附加验证:倍数
{
"type": "number",
"multipleOf": 10
}
multipleOf:5、0、10
- 4.附加验证:大于、小于
匹配目标:包含0和100的
{
"type": "number",
"minimum": 0,
"maximum": 100
}
0~100
匹配目标:不包含0和100的
{
"type": "number",
"exclusiveMinimum": 0,
"exclusiveMaximum": 100
}
1~99
也可以组合起来:
{
"type": "number",
"minimum": 0,
"exclusiveMaximum": 100
}
0~99
八. 举例说明
//-- 1. 比如你有一个接口所返回数据的正确的格式是这样的:
{
"msg":"success", //假设success表示接口处理业务正常
"code":200 //假设code是201、202、203、204 都表示通讯正常
}
//-- 2. 那么,针对以上数据格式, 写一份JSON Schema来检查
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [ "msg", "code" ], //required表示数据里必须有这2个字段"msg", "code"
"type": "object", //这个表示接口返回的整份数据要是一个json对象,几乎是必写的,不用管
"properties": { //这里写上你要对哪些字段做规则约束, 当然,没有写的字段就不会校验
"msg": {
"type": "string", //msg必须是字符串类型
"pattern":"/success/" //正则匹配,msg必须是success这一单词
},
"code": {
"type": "number", //code必须是整数类型
"minimum": 200, //code最小是200
"maximum": 204 //code最大是204
}
}
}