文章目录
一、针对与“大响应数据”如何断言?
针对主要且少量的业务字段断言。
其他字段不做数据正确性断言,只做类型与整体结构的校验。
与前面的版本进行 diff,对比差异化的地方。
二、JSONSchema 简介
使用 JSON 格式编写的
可以用来定义校验 JSON 数据的结构
可以用来校验 JSON 数据的一致性
可以用来校验 API 接口请求和响应
三、JSONSchema 整体结构响应断言
预先生成对应结构的 Schema。
将实际获取到的响应与生成的 Schema 进行对比。
四、JSONSchema 的生成和验证
安装:pip install genson。
导入:from genson import SchemaBuilder
1、实例化SchemaBuilder类
builder = SchemaBuilder()
2、调用add_object方法,将要转换成jsonschema的数据传入进去
builder.add_object(obj)
3、转成schema
results = builder.to_schema()
安装:pip install jsonschema
导入:from jsonschema import validate
validate(data_object, schema=schema)
可以使用类方法,就可以实现JSONSchemaUtils.方法
import json
from genson import SchemaBuilder
from jsonschema import validate
# 可以使用类方法,就可以实现JSONSchemaUtils.方法
class JSONSchemaUtils:
@classmethod
def validate_scheam_by_file(cls,data_obj,schema_file):
with open(schema_file,"r",encoding="utf-8") as f:
schema_data=son.load(f)
return cls.validate_schema(data_obj,schema_data)
@classmethod
def validate_schema(cls, data_object, schema):
"""
通过jsonschema验证数据
"""
# 问题:在实际工作中,不想直接抛出错误,而是返回是否成功的标志,True或者False
try:
validate(data_object, schema=schema)
return True
except Exception as e:
print(f"结构体验证失败,失败元素是{e}")
return False
@classmethod
def generate_jsonschema_by_file(cls,obj,file_path):
json_schema_data=cls.generate_jsonschema(obj)
with open(file_path, "w", encoding="utf-8") as f:
json.dump(json_schema_data, f)
@classmethod
def generate_jsonschema(cls, obj):
"""
生成jsonschema数据
"""
# 1、实例化SchemaBuilder类
builder = SchemaBuilder()
# 2、调用add_object方法,将要转换成jsonschema的数据传入进去
builder.add_object(obj)
# 3、转成schema
return builder.to_schema()
测试用例
import requests
from L3.test_jsonschema.jsonschema_utils import JSONSchemaUtils
def test_httbin_generate_schema():
"""
针对httbin的响应信息,生成对应的schema结构文件
:return:
"""
r=requests.get("https://www.baidu.com/get")
JSONSchemaUtils.generate_jsonschema_by_file(r.json(),"httpbin.json")
def test_httpbin_req():
#1、获取响应信息
r = requests.get("https://www.baidu.com/get")
#2、将相应信息,传入到验证方法里面
validate_res=JSONSchemaUtils.validate_scheam_by_file(r.json(),"httpbin.json")
#验证结构是否一致
assert validate_res==True