×
<在线客服<
                    
                         
                    
                         
                    

python接口自动化json效验神器jsonschema

作者:
schema语法参数描述$schema表示该JSONSchema文件遵循的规范title为该JSONSchema文件提供一个标题description关于该JSONSchema文件的描述信息type表示待校验元素的类型例如,最外层的type表示待校验的是一个JSON对象,内层type分别表示待校验的元素类型为,整数,字符串,数字properties定义待校验的JSON对象中,各个key-value对中value的限制条件required定义待校验的JSON对象中,必须存在的keyminimum用于约束取值范围,表示取值范围应该大于或等于minimumexclusiveMinimum如果minimum和exclusiveMinimum同时存在,且exclusiveMinimum的值为true,则表示取值范围只能大于minimummaximum用于约束取值范围,表示取值范围应该小于或等于maximumexclusiveMaximum如果maximum和exclusiveMaximum同时存在,且exclusiveMaximum的值为true,则表示取值范围只能小于maximummultip

前言

前面一篇讲到json解析神器jsonpath, jsonpath是为了方便快速取值,如果我们要校验json的字段类型和格式,就不是那边方便了。
比如当接口返回一个token,这个token值不是固定的,就算取到了也不好断言,这时候我们希望断言的是token的类型是字符串,长度是固定多少位。

jsonschema

先安装 jsonschema 依赖包

pip install jsonschema

jsonschema 是基于JSON格式,用于定义 JSON 数据结构以及校验 JSON 数据内容。支持python2.7+和python3+
jsonschema 参考文档地址:https://python-jsonschema.readthedocs.io/en/latest/

>>> from jsonschema import validate>>> # A sample schema, like what we'd get from json.load()>>> schema = {...     "type" : "object",...     "properties" : {...         "price" : {"type" : "number"},...         "name" : {"type" : "string"},...     },... }>>> # If no exception is raised by validate(), the instance is valid.>>> validate(instance={"name" : "Eggs", "price" : 34.99}, schema=schema)>>> validate(...     instance={"name" : "Eggs", "price" : "Invalid"}, schema=schema,... )                                   Traceback (most recent call last):    ...ValidationError: 'Invalid' is not of type 'number'

也可以支持命令行执行

$ jsonschema -i sample.json sample.schema

完全支持 Draft 7, Draft 6, Draft 4Draft 3

使用示例

如下带有token的校验,由于token的值不固定,它是一个40位长度的16进制,0-9和a-f生成的字符串,可以用正则匹配

from jsonschema import validate# 作者-上海悠悠 QQ交流群:717225969# blog地址 https://www.cnblogs.com/yoyoketang/# 需要校验的内容result = {    "code": 0,    "msg": "login success!",    "token": "000038efc7edc7438d781b0775eeaa009cb64865",    "username": "test"}# 编写schema 内容schema = {    "$schema": "http://json-schema.org/draft-04/schema#",    "title": "test demo",    "description": "validate result information",    "type": "object",    "properties": {        "code": {            "description": "error code",            "type": "integer"        },        "msg": {            "description": "error msg ",            "type": "string"        },        "token":        {            "description": "login success return token",            "maxLength": 40,            "pattern": "^[a-f0-9]{40}$",  # 正则校验a-f0-9的16进制,总长度40            "type": "string"        }    },    "required": [        "code", "msg", "token"    ]}# validate校验, 跟assert断言一个意思validate(instance=result, schema=schema)

validate 校验成功时候,不会有报错

  • JSON 数据校验失败,抛出 jsonschema.exceptions.ValidationError 异常

  • schema 模式本身有问题,抛出 jsonschema.exceptions.SchemaError 异常

schema语法

参数描述
$schema表示该JSON Schema文件遵循的规范
title为该JSON Schema文件提供一个标题
description关于该JSON Schema文件的描述信息
type表示待校验元素的类型(例如,最外层的type表示待校验的是一个JSON对象,内层type分别表示待校验的元素类型为,整数,字符串,数字)
properties定义待校验的JSON对象中,各个key-value对中value的限制条件
required定义待校验的JSON对象中,必须存在的key
minimum用于约束取值范围,表示取值范围应该大于或等于minimum
exclusiveMinimum如果minimum和exclusiveMinimum同时存在,且exclusiveMinimum的值为true,则表示取值范围只能大于minimum
maximum用于约束取值范围,表示取值范围应该小于或等于maximum
exclusiveMaximum如果maximum和exclusiveMaximum同时存在,且exclusiveMaximum的值为true,则表示取值范围只能小于maximum
multipleOf用于约束取值,表示取值必须能够被multipleOf所指定的值整除
maxLength字符串类型数据的最大长度
minLength字符串类型数据的最小长度
pattern使用正则表达式约束字符串类型数据

type取值

type取值python数据类型
objectdict
arraylist
integerint
numberfloat或int
nullNone
booleanbool
stringstr

2020年第四期《python接口自动化+测试开发》课程,(火热报名中!)