在自动化测试项目中,我们经常需要管理大量的测试数据、环境配置、用例参数 ------ 如果直接写死在代码里,不仅修改麻烦,还会导致代码和数据强耦合。
YAML 正是解决这个问题的 "神器",它以极简的语法、极高的可读性,成为了自动化测试、DevOps 领域最主流的配置文件格式之一。
本文将从 YAML 的基础概念、语法规则、Python 读写实战,到自动化测试场景的最佳实践,带你全面掌握 YAML 的使用。
一、什么是 YAML?它有什么优势?
YAML 全称是 "YAML Ain't Markup Language" (YAML 不是标记语言),是一种轻量级、人类可读的数据序列化语言,专门用于存储配置信息和结构化数据。它的设计目标就是简单、易读、易写,和 JSON、XML 相比,优势非常明显:
1. 核心特点
- 极简语法:用空格缩进替代引号、方括号、大括号,没有多余的 "噪音字符"
- 原生支持多种数据类型:字符串、数字、布尔值、列表、字典、嵌套结构都能直接表示;
- 和 Python 天然适配:缩进风格和 Python 保持一致,学习成本极低;
- 跨语言兼容:支持几乎所有主流编程语言,团队协作中不同语言的项目都能直接使用。
2. 关键注意事项
- 区分大小写:name 和 Name 是两个完全不同的键;
- 禁止使用 Tab 键:YAML 不允许 Tab 缩进,编辑器中按下 Tab 会自动替换为空格;
- 严格缩进规则:同层级的键必须对齐,缩进错误会直接导致解析失败;
- 文件后缀:推荐使用 .yml(更短,更常用)或 .yaml。
二、YAML 基础语法:一文看懂所有数据类型
YAML 支持所有自动化测试中常用的数据结构,以下是和 JSON 的对照示例,帮你快速掌握:
| 数据类型 | YAML 写法 | JSON 对应写法 |
|---|---|---|
| 键值对(基础) | key: value |
{"key": "value"} |
| 整数 / 浮点数 | int_key: 123``float_key: 123.456 |
{"int_key": 123, "float_key": 123.456} |
| 布尔值 | bool_key: true |
{"bool_key": true} |
| 字符串 | string_key: "This is a string" |
{"string_key": "This is a string"} |
| 列表(数组) | list_key:`` - item1`` - item2 |
{"list_key": ["item1", "item2"]} |
| 字典(映射) | map_key:`` sub_key1: value1`` sub_key2: value2 |
{"map_key": {"sub_key1": "value1", "sub_key2": "value2"}} |
| 嵌套结构 | nested_key:`` list_key:`` - item1`` map_key:`` sub_key: value |
{"nested_key": {"list_key": ["item1"], "map_key": {"sub_key": "value"}}} |
小技巧:JSON 转 YAML 工具
如果短时间内记不住所有语法,可以直接用在线工具转换,比如 json2yaml,把 JSON 粘贴进去就能自动生成 YAML 格式,避免手动写错。
三、Python 操作 YAML:读写配置文件实战
在 Python 中,我们使用 PyYAML 库来读写 YAML 文件,以下是完整的安装和实战步骤。
1. 安装 PyYAML
在你的虚拟环境终端中执行:
pip install PyYAML==6.0.1
安装完成后,就能在代码中 import yaml 使用了。
2. 核心读写操作
创建yaml文件

以下是自动化测试中最常用的 YAML 读写模板,包含写入、读取、清空三种操作:
python
import yaml
# 追加/写入 YAML 文件
def write_yaml(filename, data, encoding="utf-8", mode="a+"):
with open(filename, encoding=encoding, mode=mode) as f:
yaml.safe_dump(data, stream=f, allow_unicode=True)
# 读取 YAML 文件,支持按 key 读取
def read_yaml(filename, key=None, encoding="utf-8"):
with open(filename, encoding=encoding, mode="r") as f:
data = yaml.safe_load(f)
if key:
return data.get(key)
return data
# 清空 YAML 文件
def clear_yaml(filename, encoding="utf-8"):
with open(filename, encoding=encoding, mode="w") as f:
f.truncate()
# 测试示例
def test_yaml_operation():
# 1. 写入数据
test_data = {
"str": "12345",
"user": {
"username": "admin",
"password": "123456"
},
"test_cases": ["login_success", "login_fail"]
}
write_yaml("test.yml", test_data)
# 2. 读取数据
ret = read_yaml("test.yml", "str")
print("读取结果:", ret) # 输出:读取结果:12345
# 3. 清空文件
clear_yaml("test.yml")
关键函数说明
- yaml.safe_dump:安全写入数据,避免解析漏洞,allow_unicode=True 支持写入中文;
- yaml.safe_load:安全读取数据,自动将 YAML 解析为 Python 字典 / 列表;
- read_yaml 支持按 key 读取,适合自动化测试中读取指定配置项。
四、YAML 在自动化测试中的核心使用场景
YAML 之所以成为自动化测试的标配,是因为它完美解决了测试项目中 "数据和代码耦合" 的痛点,以下是最常用的三个场景:
1. 测试数据驱动
把多组测试用例数据(比如登录账号、接口参数)写在 YAML 文件中,用 pytest 参数化读取,实现 "一套用例跑多组数据":
python
# test_data.yml
login_cases:
- username: "admin"
password: "123456"
expected: "登录成功"
- username: "wrong_user"
password: "123456"
expected: "用户名或密码错误"
在 pytest 中读取并参数化:
python
import pytest
import yaml
with open("test_data.yml", "r", encoding="utf-8") as f:
login_cases = yaml.safe_load(f)["login_cases"]
@pytest.mark.parametrize("case", login_cases)
def test_login(case):
print(f"测试用户:{case['username']},预期结果:{case['expected']}")
# 这里写登录的测试逻辑
2. 环境配置管理
不同环境(测试、预发、生产)的 URL、数据库地址、账号密码,都可以写在 YAML 中,通过切换配置文件实现环境切换,不用修改代码:
python
# config.yml
test:
base_url: "http://test.example.com"
db_host: "test-db.example.com"
pre:
base_url: "http://pre.example.com"
db_host: "pre-db.example.com"
prod:
base_url: "http://prod.example.com"
db_host: "prod-db.example.com"
3. 用例步骤管理
对于复杂的 GUI 自动化用例,可以把操作步骤、元素定位方式写在 YAML 中,实现用例和代码分离,非技术人员也能维护用例:
python
# steps.yml
login_steps:
- action: "input"
locator: "id=username"
value: "admin"
- action: "input"
locator: "id=password"
value: "123456"
- action: "click"
locator: "id=loginBtn"
五、使用 YAML 的避坑指南
- 缩进问题:同层级的键必须对齐,建议使用 2 个空格缩进,编辑器中关闭 Tab 自动替换功能;
- 中文乱码:读写文件时必须指定 encoding="utf-8",yaml.safe_dump 时加上 allow_unicode=True;
- 空文件处理:读取空 YAML 文件时会返回 None,建议在 read_yaml 函数中加 if data: 判断;
- 数据类型:YAML 会自动识别数据类型,比如 123 会被解析为整数,"123" 才是字符串,避免类型不匹配导致断言失败。
六、总结
YAML 以其极简的语法、极高的可读性,成为了自动化测试项目中管理配置和测试数据的最佳选择。它不仅能让你的代码更简洁、易维护,还能实现数据和逻辑的解耦,让非技术人员也能参与维护测试用例和配置。
掌握 YAML 的读写和使用,是搭建企业级自动化测试框架的必备技能。后续我们会结合 pytest 参数化、fixture,带你实现一个完整的 "YAML 数据驱动 GUI 自动化测试框架"。