15:YAML配置文件

在自动化测试项目中,我们经常需要管理大量的测试数据、环境配置、用例参数 ------ 如果直接写死在代码里,不仅修改麻烦,还会导致代码和数据强耦合。

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 自动化测试框架"。

相关推荐
l1t7 小时前
DeepSeek总结的使用实体-组件-系统和基于存在性处理进行Python编程12-14
开发语言·网络·python
小快说网安7 小时前
云服务器抗 DDoS 只靠基础防护够吗?
运维·服务器·ddos
怎么没有名字注册了啊7 小时前
fedora 换源教程
linux·运维·服务器
爱莉希雅&&&7 小时前
Zabbix监控linux服务器和Windows服务器
linux·运维·服务器·zabbix·监控
IT龟苓膏7 小时前
MySQL 表设计与 SQL 优化:从字段类型、主键设计到深分页优化一篇讲清
数据库·sql·mysql
TDengine (老段)7 小时前
TDengine WAL 预写日志机制 — 持久性保障与崩溃恢复
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
xufengzhu7 小时前
uv 包管理器初接触
python·uv
HZZSDSCYZ8 小时前
2026年杭州电商新趋势:专业公司如何引领未来市场
大数据·人工智能·python
用户8356290780518 小时前
使用 Python 创建 Excel 雷达图
后端·python