承接前面 Pytest 框架全系列知识点用例规则、前后置、断言、参数化、Fixture本篇讲解YAML是自动化项目实现「代码与用例数据分离」最主流配置文件接口自动化 90% 项目都会用 yml 存储接口地址、请求参数、测试用例数据搭配 PytestFixture 参数化实现标准自动化项目架构。一、YAML 基础概念 优势1. 什么是 YAMLYAML 全称YAML Aint Markup LanguageYAML 不是标记语言是面向人类可读的数据序列化格式后缀.yml/.yaml自动化领域统一简写.yml用来替代 JSON/XML 做配置、用例数据存储。2. YAML 对比 JSON/XML 核心优势极简无冗余符号去掉 JSON 的{}、、逗号靠缩进区分层级编写效率更高天然适配配置场景注释友好#单行注释JSON 不支持注释配置文件可读性碾压 JSON缩进逻辑和 Python 一致Python 开发上手零门槛原生支持列表、字典、布尔、数字、嵌套结构完美匹配接口 JSON 返回格式。3. YAML 硬性语法规范避坑必看严格区分大小写Name和name是两个不同 key禁止使用 Tab 制表符只能用空格缩进一般 2 空格编辑器 Tab 自动转空格缩进决定层级关系同层级缩进空格数必须一致#代表单行注释不能行内注释。在线工具JSON 一键转 YAMLhttps://www.jashtool.com/json/to-yaml复杂结构快速转换二、YAML 全数据类型语法详解对标 JSON附对照代码yml 支持字符串、数字、布尔、列表、字典、嵌套组合6 种核心数据下面每种格式附带 yml 写法 等效 JSON适配接口参数场景。1. 基础键值对对标 JSON 对象键值yaml# yml写法 username: admin password: 123456等效 JSON{username:admin,password:123456}2. 数值类型int 整数 /float 浮点数yamlint_num: 99 float_num: 123.456json{int_num:99,float_num:123.456}3. 布尔值true/false小写自动识别 bool 类型yamlis_login: true is_delete: falsejson{is_login:true,is_delete:false}4. 字符串默认不用引号特殊字符才加双引号yaml# 普通字符串无需引号 title: 用户登录接口 # 含特殊符号用双引号 desc: 接口地址/api/login请求方式POSTjson{title:用户登录接口,desc:接口地址/api/login请求方式POST}5. 列表短横线- 空格开头一行一个元素yaml# 接口参数列表 params_list: - admin - root - test01json{params_list:[admin,root,test01]}6. 嵌套字典缩进实现子键接口返回嵌套 json 最常用yamluser_info: uid: 1001 name: 张三 phone: 13800138000json{user_info:{uid:1001,name:张三,phone:13800138000}}7. 列表 字典混合嵌套接口用例标准格式自动化高频最常用一条用例 字典多条用例放入列表yaml# 登录接口多组测试用例 login_case: - case_name: 正确账号密码登录 req_data: username: admin password: 123456 expect_code: 200 - case_name: 密码错误登录 req_data: username: admin password: 654321 expect_code: 401上面是接口自动化 yml 用例标准模板后续结合 pytest 参数化直接读取批量执行。三、PyYAML 环境安装Python 使用PyYAML库读写 yml 文件固定版本6.0.1避免版本 API 差异# 安装指定版本 pip install PyYAML6.0.1四、PyYAML 核心yml 读取 写入代码封装封装通用工具类read_yaml读取、write_yaml新增写入、clear_yaml清空文件自动化项目通用工具函数。import yaml # 1. 读取yml指定key数据 def read_yaml(file_path, keyNone): :param file_path: yml文件路径 :param key: 需要读取的键不传则返回全部数据 with open(file_path, encodingutf-8, moder) as f: data yaml.safe_load(f) # safe_load安全加载规避恶意代码注入 if key: return data.get(key) return data # 2. 追加/写入yml文件a追加w覆盖 def write_yaml(file_path, data): with open(file_path, encodingutf-8, modea) as f: yaml.safe_dump(data, streamf, allow_unicodeTrue) # allow_unicodeTrue中文不乱码必加参数 # 3. 清空yml文件内容 def clear_yaml(file_path): with open(file_path, encodingutf-8, modew) as f: f.truncate() # 测试用例 def test_yml_opt(): # 写入数据 test_data {str: 12345} write_yaml(test.yml, test_data) # 读取数据 res read_yaml(test.yml, str) print(读取结果, res) # clear_yaml(test.yml) # 按需清空关键参数allow_unicodeTrue不加会出现中文转 unicode 编码\u5f20\u4e09存储中文 yml 必带。五、实战 1PytestYAML 实现接口用例数据分离项目落地步骤 1新建api_case.yml存储登录接口多组用例login_api: - case_title: 正常登录 url: https://jsonplaceholder.typicode.com/users/1 method: GET expect_uid: 1 - case_title: 异常ID查询 url: https://jsonplaceholder.typicode.com/users/999 method: GET expect_uid: None步骤 2pytest 参数化读取 yml自动批量执行用例import pytest import requests from common.yaml_util import read_yaml # 导入上面封装的读取函数 # 读取yml内登录用例 case_data read_yaml(api_case.yml, login_api) # 参数化批量生成用例 pytest.mark.parametrize(case, case_data) def test_login_api(case): # 从yml取出接口参数 url case[url] expect case[expect_uid] res requests.get(url) # 结合之前assert断言 if res.status_code 200: actual_uid res.json()[id] assert actual_uid expect, f{case[case_title]}校验失败预期{expect},实际{actual_uid} else: assert expect is None执行效果yml 里 2 组用例自动生成 2 条 pytest 用例新增测试场景只需要修改 yml不用改动 Python 代码完美实现数据代码分离。六、实战 2FixtureYAML 全局配置conftest 读取全局环境配置1. 项目根目录config.yml全局环境配置域名、请求头yamlbase_url: https://jsonplaceholder.typicode.com headers: Content-Type: application/json token: test_token_0012. conftest.py 全局 fixture全项目任意用例直接引用import pytest from common.yaml_util import read_yaml pytest.fixture(scopesession) def global_config(): # 项目全局读取配置yml config read_yaml(config.yml) return config3. 任意测试用例直接调用全局配置def test_post_query(global_config): base global_config[base_url] header global_config[headers] url f{base}/posts/1 res requests.get(url,headersheader) assert res.status_code 200七、PyYAML 常用避坑总结中文乱码safe_dump必须加allow_unicodeTrue缩进报错统一 2 空格缩进全程禁用 Tab加载文件空值yml 空行、格式错误会导致safe_load返回 None安全规范优先用yaml.safe_load()禁止yaml.load()老版本存在代码注入漏洞列表横线-后面必须带空格-admin写法非法正确- admin。八、拓展自动化项目 yml 分层规范企业项目目录自动化项目/ ├─ config/ │ └─ env.yml # 全局环境配置域名、数据库地址 ├─ testcase/ │ ├─ login_case.yml # 登录模块用例 │ └─ user_case.yml # 用户模块用例 ├─ common/ │ └─ yaml_tool.py # 封装yml读写工具类 └─ conftest.py # fixture全局读取配置
8:YAML 语法
发布时间:2026/6/2 23:01:14
承接前面 Pytest 框架全系列知识点用例规则、前后置、断言、参数化、Fixture本篇讲解YAML是自动化项目实现「代码与用例数据分离」最主流配置文件接口自动化 90% 项目都会用 yml 存储接口地址、请求参数、测试用例数据搭配 PytestFixture 参数化实现标准自动化项目架构。一、YAML 基础概念 优势1. 什么是 YAMLYAML 全称YAML Aint Markup LanguageYAML 不是标记语言是面向人类可读的数据序列化格式后缀.yml/.yaml自动化领域统一简写.yml用来替代 JSON/XML 做配置、用例数据存储。2. YAML 对比 JSON/XML 核心优势极简无冗余符号去掉 JSON 的{}、、逗号靠缩进区分层级编写效率更高天然适配配置场景注释友好#单行注释JSON 不支持注释配置文件可读性碾压 JSON缩进逻辑和 Python 一致Python 开发上手零门槛原生支持列表、字典、布尔、数字、嵌套结构完美匹配接口 JSON 返回格式。3. YAML 硬性语法规范避坑必看严格区分大小写Name和name是两个不同 key禁止使用 Tab 制表符只能用空格缩进一般 2 空格编辑器 Tab 自动转空格缩进决定层级关系同层级缩进空格数必须一致#代表单行注释不能行内注释。在线工具JSON 一键转 YAMLhttps://www.jashtool.com/json/to-yaml复杂结构快速转换二、YAML 全数据类型语法详解对标 JSON附对照代码yml 支持字符串、数字、布尔、列表、字典、嵌套组合6 种核心数据下面每种格式附带 yml 写法 等效 JSON适配接口参数场景。1. 基础键值对对标 JSON 对象键值yaml# yml写法 username: admin password: 123456等效 JSON{username:admin,password:123456}2. 数值类型int 整数 /float 浮点数yamlint_num: 99 float_num: 123.456json{int_num:99,float_num:123.456}3. 布尔值true/false小写自动识别 bool 类型yamlis_login: true is_delete: falsejson{is_login:true,is_delete:false}4. 字符串默认不用引号特殊字符才加双引号yaml# 普通字符串无需引号 title: 用户登录接口 # 含特殊符号用双引号 desc: 接口地址/api/login请求方式POSTjson{title:用户登录接口,desc:接口地址/api/login请求方式POST}5. 列表短横线- 空格开头一行一个元素yaml# 接口参数列表 params_list: - admin - root - test01json{params_list:[admin,root,test01]}6. 嵌套字典缩进实现子键接口返回嵌套 json 最常用yamluser_info: uid: 1001 name: 张三 phone: 13800138000json{user_info:{uid:1001,name:张三,phone:13800138000}}7. 列表 字典混合嵌套接口用例标准格式自动化高频最常用一条用例 字典多条用例放入列表yaml# 登录接口多组测试用例 login_case: - case_name: 正确账号密码登录 req_data: username: admin password: 123456 expect_code: 200 - case_name: 密码错误登录 req_data: username: admin password: 654321 expect_code: 401上面是接口自动化 yml 用例标准模板后续结合 pytest 参数化直接读取批量执行。三、PyYAML 环境安装Python 使用PyYAML库读写 yml 文件固定版本6.0.1避免版本 API 差异# 安装指定版本 pip install PyYAML6.0.1四、PyYAML 核心yml 读取 写入代码封装封装通用工具类read_yaml读取、write_yaml新增写入、clear_yaml清空文件自动化项目通用工具函数。import yaml # 1. 读取yml指定key数据 def read_yaml(file_path, keyNone): :param file_path: yml文件路径 :param key: 需要读取的键不传则返回全部数据 with open(file_path, encodingutf-8, moder) as f: data yaml.safe_load(f) # safe_load安全加载规避恶意代码注入 if key: return data.get(key) return data # 2. 追加/写入yml文件a追加w覆盖 def write_yaml(file_path, data): with open(file_path, encodingutf-8, modea) as f: yaml.safe_dump(data, streamf, allow_unicodeTrue) # allow_unicodeTrue中文不乱码必加参数 # 3. 清空yml文件内容 def clear_yaml(file_path): with open(file_path, encodingutf-8, modew) as f: f.truncate() # 测试用例 def test_yml_opt(): # 写入数据 test_data {str: 12345} write_yaml(test.yml, test_data) # 读取数据 res read_yaml(test.yml, str) print(读取结果, res) # clear_yaml(test.yml) # 按需清空关键参数allow_unicodeTrue不加会出现中文转 unicode 编码\u5f20\u4e09存储中文 yml 必带。五、实战 1PytestYAML 实现接口用例数据分离项目落地步骤 1新建api_case.yml存储登录接口多组用例login_api: - case_title: 正常登录 url: https://jsonplaceholder.typicode.com/users/1 method: GET expect_uid: 1 - case_title: 异常ID查询 url: https://jsonplaceholder.typicode.com/users/999 method: GET expect_uid: None步骤 2pytest 参数化读取 yml自动批量执行用例import pytest import requests from common.yaml_util import read_yaml # 导入上面封装的读取函数 # 读取yml内登录用例 case_data read_yaml(api_case.yml, login_api) # 参数化批量生成用例 pytest.mark.parametrize(case, case_data) def test_login_api(case): # 从yml取出接口参数 url case[url] expect case[expect_uid] res requests.get(url) # 结合之前assert断言 if res.status_code 200: actual_uid res.json()[id] assert actual_uid expect, f{case[case_title]}校验失败预期{expect},实际{actual_uid} else: assert expect is None执行效果yml 里 2 组用例自动生成 2 条 pytest 用例新增测试场景只需要修改 yml不用改动 Python 代码完美实现数据代码分离。六、实战 2FixtureYAML 全局配置conftest 读取全局环境配置1. 项目根目录config.yml全局环境配置域名、请求头yamlbase_url: https://jsonplaceholder.typicode.com headers: Content-Type: application/json token: test_token_0012. conftest.py 全局 fixture全项目任意用例直接引用import pytest from common.yaml_util import read_yaml pytest.fixture(scopesession) def global_config(): # 项目全局读取配置yml config read_yaml(config.yml) return config3. 任意测试用例直接调用全局配置def test_post_query(global_config): base global_config[base_url] header global_config[headers] url f{base}/posts/1 res requests.get(url,headersheader) assert res.status_code 200七、PyYAML 常用避坑总结中文乱码safe_dump必须加allow_unicodeTrue缩进报错统一 2 空格缩进全程禁用 Tab加载文件空值yml 空行、格式错误会导致safe_load返回 None安全规范优先用yaml.safe_load()禁止yaml.load()老版本存在代码注入漏洞列表横线-后面必须带空格-admin写法非法正确- admin。八、拓展自动化项目 yml 分层规范企业项目目录自动化项目/ ├─ config/ │ └─ env.yml # 全局环境配置域名、数据库地址 ├─ testcase/ │ ├─ login_case.yml # 登录模块用例 │ └─ user_case.yml # 用户模块用例 ├─ common/ │ └─ yaml_tool.py # 封装yml读写工具类 └─ conftest.py # fixture全局读取配置