jsonschema — Python全量字段校验

概念:校验接⼝返回响应结果的全部字段(更进一步的断言)

校验内容:

字段值

字段名 或 字段类型

校验流程:

定义json语法校验格式

⽐对接口实际响应数据是否符合json校验格式

安装 jsonschema

pip install jsonschema -i https://pypi.douban.com/simple/

查验:

在终端查验:pip listpip 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)

 

posted @ 2023-08-31 23:18  鹿先森JIAN  阅读(763)  评论(0编辑  收藏  举报