python接口自动化34-json校验神器jsonschema

前言

前面一篇讲到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数据类型
object dict
array list
integer int
number float或int
null None
boolean bool
string str
(0)

相关推荐

  • Python中Json和dict区别对比?入门分享!

    最近有人问小编说:Python开发中字典和Json的区别是什么?关于这个问题,小编通过下文为大家介绍一下. 什么是字典? 字典是一种数据结构,而json是一种数据格式就会有一些形式上的限制,比如jso ...

  • python中的json、pickle

    json 提供了四个功能: dumps:将json数据转换为字符串 json.dumps(obj,skipkeys=False,separators=None,sort_keys=False) loa ...

  • python接口自动化13-data和json参数傻傻分不清

    前言 在发post请求的时候,有时候body部分要传data参数,有时候body部分又要传json参数,那么问题来了:到底什么时候该传json,什么时候该传data? 一.识别json参数 1.在前面 ...

  • python接口自动化33-json解析神器jsonpath

    前言 做接口测试的时候,大部分情况下返回的是json数据,我们需要对返回的json断言. 当返回的数据量比较大,并且嵌套的层级很深的时候,很多小伙伴不会取值,往往在返回结果取值上浪费很多时间,于是就有 ...

  • python接口自动化39-JMESPath解析json数据

    前言 前面学了 jsonpath 可以很好的解析 json 数据,提取出我们想要的内容,对于平常的基本工作没太大的问题,但有一点点小遗憾. jsonpath 的 python 库功能并不是很强大,不支 ...

  • python接口自动化1-发送get请求

    前言 requests模块,也就是老污龟,为啥叫它老污龟呢,因为这个官网上的logo就是这只污龟,接下来后面的自动化都离不开它. 一.环境安装 1.用pip安装requests模块 >>p ...

  • python接口自动化2-发送post请求

    前言 发送post的请求参考例子很简单,实际遇到的情况却是很复杂的,首先第一个post请求肯定是登录了,但登录是最难处理的.登录问题解决了,后面都简单了. 一.查看官方文档 1.学习一个新的模块,其实 ...

  • python接口自动化3-自动发帖(session)

    前言 上一篇模拟登录博客园,但这只是第一步,一般登录后,还会有其它的操作,如发帖,评论等,这时候如何保持会话呢? 一.session简介 1.查看帮助文档,贴了一部分,后面省略了 >>im ...

  • python接口自动化4-绕过验证码登录(cookie)

    前言 有些登录的接口会有验证码:短信验证码,图形验证码等,这种登录的话验证码参数可以从后台获取的(或者查数据库最直接). 获取不到也没关系,可以通过添加cookie的方式绕过验证码. 一.抓登录coo ...

  • python接口自动化5-Json数据处理

    前言 有些post的请求参数是json格式的,这个前面第二篇post请求里面提到过,需要导入json模块处理. 一般常见的接口返回数据也是json格式的,我们在做判断时候,往往只需要提取其中几个关键的 ...

  • python接口自动化6-重定向(Location)

    前言 某屌丝男A鼓起勇气向女神B打电话表白,女神B是个心机婊觉得屌丝男A是好人,不想直接拒绝于是设置呼叫转移给闺蜜C了,最终屌丝男A和女神闺蜜C表白成功了,这种场景其实就是重定向了. 一.重定向 1. ...