YAML深度解析:语法规范与Python实践指南
YAML简介
YAML(YAML Ain’t Markup Language)是一种以人类可读性为核心设计的数据序列化格式。它通过简洁的结构表达复杂的数据关系,广泛应用于配置管理、数据交换和自动化测试等领域。其核心优势在于语法直观、层级清晰,且对多种编程语言具有良好的兼容性。
基本语法规则
- 缩进表示层级:使用空格而非括号或符号定义嵌套结构,推荐每级缩进2或4个空格,全文档需保持一致。
- 键值对用冒号分隔:如
name: "Alice"。 - 列表项以短横线开头:如
- item1表示一个元素。 - 注释以 # 开头:例如
# 这是一个注释。 - 支持锚点与引用:可通过
&anchor定义,用*anchor引用。
常见数据类型示例
| 类型 | 语法 | 示例 |
|---|---|---|
| 字符串 | 双引号或单引号包裹,也可省略 | city: "Beijing" |
| 数字 | 直接书写 | score: 95 |
| 布尔值 | true / false | active: true |
| 列表 | 每项前加 - | colors: - red - blue |
| 字典 | 键值对分行书写 | user: name: Bob age: 25 |
| 空值 | null | status: null |
Python中操作YAML文件
使用 PyYAML 库实现读写功能:
pip install pyyaml
读取YAML文件
import yaml
with open("config.yaml", "r", encoding="utf-8") as file:
data = yaml.safe_load(file)
print(data)
该方法将YAML内容转换为Python原生数据类型(字典、列表等),安全且避免执行恶意代码。
写入YAML文件
import yaml
data = {
"user": {
"name": "Emma",
"age": 28,
"address": {
"street": "456 Oak Ave",
"city": "New York",
"zip": "10001"
}
}
}
with open("output.yaml", "w", encoding="utf-8") as file:
yaml.dump(data, file, default_flow_style=False, encoding="utf-8")
使用 default_flow_style=False 可确保输出格式美观,适合人工阅读。
结合UI自动化构建关键字驱动测试
利用YAML存储测试步骤,实现逻辑与脚本分离:
1. 准备测试数据(test_steps.yaml)
steps:
- action: goto
params: {url: "https://example.com"}
- action: click
params: {locator: ("id", "submit-btn")}
- action: sendkeys
params: {value: "test@example.com", locator: ("name", "email")}
- action: assert_text_contains
params: {locator: ("class", "message"), excepted: "成功"}
2. 封装基础操作类
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By
class BasePage:
def __init__(self, driver: Chrome):
self.driver = driver
def goto(self, url: str):
self.driver.get(url)
def click(self, locator: tuple):
element = self.driver.find_element(*locator)
element.click()
def sendkeys(self, value: str, locator=None):
if locator:
element = self.driver.find_element(*locator)
element.send_keys(value)
else:
self.driver.send_keys(value)
def assert_text_contains(self, locator: tuple, expected: str):
element = self.driver.find_element(*locator)
assert expected in element.text
3. 执行测试用例
import time
import yaml
from selenium import webdriver
from basepage import BasePage
# 读取配置
with open("test_steps.yaml", "r", encoding="utf-8") as f:
steps = yaml.safe_load(f)["steps"]
# 启动浏览器并运行测试
driver = webdriver.Chrome()
base_page = BasePage(driver)
driver.implicitly_wait(10)
for step in steps:
method_name = step["action"]
params = step["params"]
method = getattr(base_page, method_name)
method(**params)
time.sleep(1)
driver.quit()
通过动态调用方法与参数解包,实现高度灵活的测试流程控制。