jsonschema — Python全量字段校验
概念:校验接⼝返回响应结果的全部字段(更进一步的断言)
校验内容:
字段值
字段名 或 字段类型
校验流程:
定义json语法校验格式
⽐对接口实际响应数据是否符合json校验格式
安装 jsonschema
pip install jsonschema -i https://pypi.douban.com/simple/
查验:
在终端查验:pip list 或 pip show jsonschema
校验方式
1、在线工具校验
http://json-schema-validator.herokuapp.com
https://www.jsonschemavalidator.net【推荐】
2、python代码校验
实现步骤:
-
1 导包 import jsonschema
-
2 定义 jsonschema格式 数据校验规则
-
3 调⽤ jsonschema.validate(instance="json数据", schema="jsonshema规则")
查验校验结果:
-
校验通过:返回 None
-
校验失败
-
schema 规则错误,返回 SchemaError
-
json 数据错误,返回 ValidationError
-
JSON Schema 语法
type 关键字
作用:约束数据类型
properties 关键字
说明:是 type关键字的辅助。用于 type 的值为 object 的场景。
作用:指定 对象中 每个字段的校验规则。 可以嵌套使用。
required 关键字
作用:校验对象中必须存在的字段。字段名必须是字符串,且唯⼀
const 关键字
作用:校验字段值是⼀个固定值。
import jsonschema # 测试数据 data = { "success": True, "code": 10000, "message": "操作成功", "data": None, } # 校验规则 schema = { "type": "object", "properties": { "success": {"const": True}, "code": {"const": 10000}, "message": {"const": "操作成功"}, "data": {"const": None} }, "required": ["success", "code", "message", "data"] } # 调用方法校验 res = jsonschema.validate(instance=data, schema=schema) print(res) # None: 代表校验通过 # ValidationError:数据 与 校验规则不符 # SchemaError: 校验规则 语法有误
pattern 关键字
作用:指定正则表达式,对字符串进行模糊匹配
import jsonschema # 测试数据 data = { "message": "!jeklff37294操作成功43289hke", "mobile": "15900000002" } # 校验规则 schema = { "type": "object", "properties": { "message": {"pattern": "操作成功"}, "mobile": {"pattern": "^[0-9]{11}$"} } } # 调用方法校验 res = jsonschema.validate(instance=data, schema=schema) print(res)
综合案例应用
import jsonschema # 测试数据 data = { "success": False, "code": 10000, "message": "xxx登录成功", "data": { "age": 20, "name": "lily" } } # 校验规则 schema = { "type": "object", "properties": { "success": {"type": "boolean"}, "code": {"type": "integer"}, "message": {"pattern": "登录成功$"}, "data": { "type": "object", "properties": { "name": {"const": "lily"}, "age": {"const": 20} }, "required": ["name", "age"] } }, "required": ["success", "code", "message", "data"] } # 调用测试方法 res = jsonschema.validate(instance=data, schema=schema) print(res)
实际应用
import unittest import jsonschema from api.ihrm_login_api import IhrmLoginApi class TestIhrmLogin(unittest.TestCase): # 登录成功 def test01_login_success(self): # 组织请求数据 json_data = {"mobile": "13800000002", "password": "123456"} # 调用自己封装的接口 resp = IhrmLoginApi.login(json_data) print("登录成功:", resp.json()) # 断言 # assert_util(self, resp, 200, True, 10000, "操作成功") # 断言 校验响应状态码 self.assertEqual(200, resp.status_code) # 使用全量字段校验,替换 断言 # 校验规则 schema = { "type": "object", "properties": { "success": {"const": True}, "code": {"const": 10000}, "message": {"pattern": "操作成功"}, "data": {"type": "string"} }, "required": ["success", "code", "message", "data"] } # 调用jsonschema校验函数 jsonschema.validate(instance=resp.json(), schema=schema)