使用JSONSchema断言

对于复杂的JSON结构,虽然可以使用JSONPath快速提取相应的值。然而对于JSON响应的整体结构和各字段类型,使用JSONSchema验证更加方便。
安装方法:

pip install jsonschema

基本使用

以上例中的响应结果为例:

{
  "args": {
    "age": "12", 
    "name": "Kevin"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.22.0", 
    "X-Amzn-Trace-Id": "Root=1-5e7f618f-30ba932936a4a8e64ef5ea06"
  }, 
  "origin": "111.202.167.11", 
  "url": "https://httpbin.org/get?name=Kevin&age=12"
}

整个JSON结构可以描述为,整体为object类型,包含args、headers、orgin、url四个属性,其中args、headers是object类型,origin、url是字符串类型,使用JSONSchema语法描述如下:

{
    "type": "object",
    "properties": {
        "args": {"type": "object"},
        "headers": {"type": "object"},
        "origin": {"type": "string"},
        "url": {"type": "string"}
    }
}

对于object对象,还可以使用required描述必须存在的属性。对于args、headers还可以继续添加properties描述其子属性,对于字符串还可以使用patten字段描述其符合的真正表达式。
JSONSchema中的类型分为string、number、integer、array、object、boolean、null七种类型。其中,number包含整数和浮点数,integer仅限整数。JSONSchema每种类型常用的关键字如表3.3所示。

Schema中常用的关键字

最外层

  • $schema 指定使用的JSONSchema协议版本
  • title 规则标题
  • description 规则描述

通用

  • type 类型,string、number、integer、array、object、boolean、null

string

  • miniLength 最小长度
  • maxLength 最大长度
  • pattern 匹配的正则表达式

number/integer

  • minimum 最小值, 结合"exclusiveMinimum": True,不包含等于
  • maximum 最大值,结合"exclusiveMaximum": True,不包含等于
  • multipleOf 可被指定数字整除

object

  • properites 子属性
  • patternProperties 子属性名满足正则表达式
  • required 必选子属性

array

  • items 子元素
  • required 必选子元素
  • miniItems 最少子元素个数
  • maxItems 最大子元素个数

使用示例

完整示例如下:

import requests
import jsonschema
res = requests.get('https://httpbin.org/get?name=Kevin&age=12')
schema = {
    "type": "object",
    "properties": {
        "args": {
            "type": "object",
            "required": ["name", "age"],
            "properties": {
                "name": {"type": "string", "pattern": "^Kevin$"},
                "age": {"type": "string", "pattern": "^12$"}
            }
        },
        "headers": {"type": "object"},
        "origin": {"type": "string", "pattern": "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"},
        "url": {"type": "string"}
    }
} 
jsonschema.validate(res.json(), schema)

上例中,required限定,args必须有name和age两个子属性。
name字段的pattern使用“^Kevin$”表示,必须以K开头,以n结尾,即完全等于Kevin。
同样,断言通过时不会有任何输出,断言失败是则会抛出异常。

猜你喜欢

转载自www.cnblogs.com/superhin/p/12596752.html