python接口自动化-高级技巧之JSON Schema

目的:
   我们在接口测试中常会遇到: 被测接口的返回值含有大量key-value节点,且往往有很多value是不固定的,有的是类型不固定、有的是值不固定;这样给接口自动化中的断言带来了巨大困扰,本章提到的jsonschema可以冲在断言最前方,当作第一道网来过滤掉大多数问题;只需几行简单声明,助你轻松实现接口自动化
 

js和python类型参照表:

jspython
stringstring
numberint/float
objectdict
arraylist
booleanbool
nullnone

一. 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"}

number
1、 -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
    }
  }
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木法星人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值