https://pyyaml.org/wiki/PyYAMLDocumentation官⽅⽂档:https://pyyaml.org/wiki/PyYAMLDocumentation

一、YAML

1.YAML 是什么?

YAML 是数据序列化语言(用来在人和计算机之间传递 / 存储数据),不是编程语言,主要用来写配置文件

它的名字演变:从 “Yet Another Markup Language(又一种标记语言)” 改成 “YAML Ain’t Markup Language(YAML 不是标记语言)”,突出它是 “数据格式” 而非 “标记语言”。

2.YAML 的核心特点
  1. 人类可读性高:语法简洁,比 JSON/XML 少了引号、括号等 “噪音”。
  2. 缩进优雅:和 Python 一样用缩进表示层级(但只能用空格,不能用 Tab)。
  3. 功能明确:只用来存配置,不是编程语言。
3.YAML 的注意事项
  1. 区分大小写nameName是两个不同的键。
  2. 不能用 Tab 缩进:必须用空格(编辑器可配置 “按 Tab 自动转空格”)。
  3. 严格缩进:缩进错误会导致解析失败。
4.YAML 的文件后缀

后缀是.yaml.yml,日常常用更简短的.yml

5.YAML 支持的数据类型(附与 JSON 的对比)

下面是 YAML 常用数据类型的写法,以及和 JSON 的对应关系:

以上语法若短时间内⽆法掌握,我们也有很多⼯具可供使⽤,如json转yaml

https://www.jashtool.com/json/to-yaml

2.使用

yaml ⽂件通常作为配置⽂件来使⽤,可以使⽤ yaml 库来读取和写⼊ YAML ⽂件

1.安装yaml库
pip install PyYAML==6.0.1
2.创建yaml⽂件

3.读取和写⼊yaml⽂件

实际逻辑:

YAML(静态配置) Python(逻辑代码)
手动编写、人工维护 只读取 YAML,不修改
存 “固定不变 / 少变” 的配置 存 “动态逻辑”(接口调用、断言、数据处理等)
格式严格(缩进 / 结构) 依赖 YAML 的配置,实现业务逻辑

二、JSONSchema

1.安装

pip install jsonschema==4.23.0

2.介绍

Json:

JSONSchema:


json转JSONSchema太⿇烦?使⽤现有⼯具⾃动转换:https://www.json.cn/json/

https://tooltt.com/json2schema/

注意:⼯具不是万能的,结果可能存在错误,要对⾃动⽣成的结果进⾏⼆次检查

“JSON 格式” vs “JSON 业务规范”
概念 含义 例子
纯 JSON 格式 只要符合{}/[]/ 键值对语法,就算 JSON 格式(语法层面) 后端返回{"code":"123", "data":"错误"} —— 语法上是合法 JSON
JSON 业务规范 除了语法,还要求:字段名正确、字段类型正确、值范围合理(业务层面) 约定code必须是"SUCCESS"/"FAIL"(字符串)、data必须是数组 —— 这是规范

后端 “写死了 JSON 格式”,但可能出现这些问题:

  • 开发改代码时手滑:把code的返回值从字符串"SUCCESS"改成了数字200
  • 新增字段时漏加:产品要求返回loginUser(布尔值),开发忘了加;
  • 类型写错:把createTime(该是字符串"2026-01-04")写成了时间戳数字1735968000
  • 环境差异:测试环境返回符合规范,生产环境因配置问题返回异常格式。

这些问题下,接口返回的依然是合法 JSON,但不符合业务规范,如果前端直接用,会导致页面报错、功能异常 —— 而 Schema 校验就是用来抓这类问题的。

2.1为啥需要 Schema 校验?(测试人员的核心诉求)
1. 替代 “重复的手动断言”,效率翻倍

如果不用 Schema,你要写一堆断言:

而用 Schema,只需要 1 行:

validate(res, schema)  # 自动校验所有字段的类型/结构
2. 提前发现 “隐性 bug”,避免前端背锅

前端开发是按 “业务规范” 写代码的(比如默认loginUser是布尔值,用if (loginUser)判断),如果后端返回loginUser: "true"(字符串),前端代码会直接出错 —— 但后端会说 “我返回的是 JSON 啊”。Schema 校验能在测试阶段就发现这个问题,而不是等前端联调时才暴露。

3. 作为 “测试用例的依据”,标准化测试

Schema 是测试人员和开发、产品约定的 “接口契约”

  • 产品定需求:“博客列表接口返回的 data 数组里,每个元素必须有 id(数字)、title(字符串)”;
  • 测试人员把这个需求转成 Schema 规则;
  • 不管后端怎么改代码,只要接口返回不符合 Schema,测试就不通过 —— 避免开发 “凭感觉改返回格式”。
2.2“为啥不都用 JSON”?—— Schema 就是 JSON 写的!

JSON Schema 本身就是一个 JSON 文件 / 字典

比如你看到的schema变量:

这本身就是一个 Python 字典(对应 JSON 格式),jsonschema库做的事情是:

  1. 把 “接口返回的 JSON” 和 “Schema 规则的 JSON” 做对比
  2. 按 Schema 里定义的type/required/properties等关键字,检查返回 JSON 是否符合规则

简单说:用 JSON 写的 Schema 规则,去校验另一个 JSON 数据是否符合规则—— 不是 “不用 JSON”,而是用 JSON 定义规则,再用规则校验 JSON。

2.3总结:Schema 校验的核心价值
角色 收益
测试人员 少写重复断言,快速发现接口格式问题,标准化测试用例
开发人员 提前发现代码改动导致的格式问题,避免联调时返工
前端人员 确保接口返回格式稳定,减少前端因格式异常导致的 bug
产品人员 确保接口实现符合需求约定,避免 “需求是 A,开发做了 B”

后端 “写死 JSON 格式” 只是保证了 “语法合法”,但业务上的 “格式正确” 需要测试人员用 Schema 来校验 —— 这也是接口自动化测试中最核心的环节之一。

3.数据类型
作用

指定 JSON 字段的数据类型,是最基础的约束。

常用类型 & 场景
type 作用 实战场景(比如用户信息 JSON)
string 文本(比如名称、时间) "name": "张三""createTime": "2026-01-04"
number 浮点数(比如价格、分数) "price": 99.9
integer 整数(比如年龄、ID) "age": 25"id": 1001
boolean 布尔值(比如开关、状态) "isVip": true
object 嵌套对象(比如用户的地址信息) "address": {"city": "北京"}
array 数组(比如用户的标签列表) "tags": ["学生", "程序员"]
null 空值(比如非必填的扩展字段) "extInfo": null
4.最⼤最⼩值
作用

约束数字类型字段的取值范围。

关键字说明
关键字 作用
minimum 数字的最小值(包含等于)
maximum 数字的最大值(包含等于)
exclusiveMinimum 数字必须严格大于某个值(不包含等于)
exclusiveMaximum 数字必须严格小于某个值(不包含等于)
示例 & 场景

→ 实战中用来约束 “年龄、分数、金额” 等数字的合理范围。

5.字符串特殊校验
作用

正则表达式约束字符串的格式(比如邮箱、手机号、密码)。

示例 & 场景

→ 实战中用来校验 “邮箱、手机号、身份证号” 等有固定格式的字符串。

6.数组约束
作用

约束数组类型字段的规则(长度、元素唯一性、元素结构)。

关键字说明
关键字 作用
minItems 数组最少有多少个元素
maxItems 数组最多有多少个元素
uniqueItems 数组元素必须唯一(不能重复)
items 数组中每个元素的类型 / 结构(嵌套约束)
示例 & 场景

→ 实战中用来约束 “标签列表、商品列表” 等数组的长度和元素规则。

7.对象约束
作用

约束对象类型字段的规则(属性数量、是否允许额外字段)。

关键字说明
关键字 作用
minProperties 对象最少有多少个属性
maxProperties 对象最多有多少个属性
additionalProperties 是否允许对象有properties外的字段(默认true

→ 实战中用来严格约束对象的结构(比如接口返回的对象不能有多余字段)。

8.必需属性
作用

指定 JSON 对象必须包含的字段(缺少则校验失败)。

示例 & 场景

9.依赖关系
作用

定义字段之间的依赖关系(比如 A 字段存在,则 B 字段必须存在)。

示例 & 场景

→ 实战中用来约束 “关联字段”(比如填了信用卡号,就必须填账单地址)。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐