目的:
我們經常發現,被測接口的返回值含有大量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"}
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