YAML在自动化测试中的三大核心作用
-
配置中心:管理测试环境/参数
# config.yaml environments: dev: url: "http://dev.api.com" timeout: 5 prod: url: "https://api.com" timeout: 10
-
数据驱动:分离测试数据与脚本
# test_data.yaml login_cases: - name: "正确账号" username: "admin" password: "P@ssw0rd" expected: "登录成功" - name: "密码错误" username: "admin" password: "wrong" expected: "密码错误"
-
流程定义:描述测试步骤序列
# test_flow.yaml smoke_test: - step: "打开首页" action: "get" url: "/home" - step: "用户登录" action: "post" url: "/login" body: user: "${admin_user}" # 引用变量 pwd: "${admin_pwd}"
零基础YAML语法速成(附避坑指南)
基础规则(5分钟掌握)
# 1. 键值对(冒号后必须空格!)
name: "登录测试" # ✅ 正确
version:1.0 # ❌ 错误(冒号后缺空格)
# 2. 列表(用短横线表示)
test_tags:
- smoke
- regression # 注意缩进对齐
# 3. 嵌套结构(缩进=2空格)
database:
host: "localhost"
port: 3306
credentials: # 嵌套对象
user: "root"
password: "123456"
# 4. 多行文本(|保留换行 >折叠换行)
description: |
这是第一行
这是第二行 # 输出两行
summary: >
这是一段很长很长的文本,
实际输出会变成一行
#### 自动化测试专用技巧
```yaml
# 1. 变量引用(配合框架实现)
api_config:
base_url: "https://api.example.com"
login: "${base_url}/auth" # → https://api.example.com/auth
# 2. 复用代码块(锚点&别名)
common_headers: &default_headers # 定义锚点
Content-Type: "application/json"
User-Agent: "AutoTest/1.0"
test_cases:
case1:
headers:
<<: *default_headers # 继承锚点
X-Token: "abc123" # 新增字段
实战:用YAML驱动Pytest测试(完整案例)
目录结构
project/
├── config/
│ ├── env.yaml # 环境配置
│ └── users.yaml # 用户数据
├── test_cases/
│ └── login_test.yaml # 测试用例
└── test_login.py # 测试脚本
步骤1:定义YAML配置文件
# env.yaml
prod:
base_url: "https://api.myapp.com"
timeout: 10
# users.yaml
credentials:
admin:
username: "admin@company.com"
password: "S3cret!2024"
guest:
username: "guest@test.com"
password: "TempP@ss"
步骤2:设计数据驱动测试用例
# login_test.yaml
test_suite: "用户登录验证"
test_cases:
- case_id: "TC-LOGIN-01"
description: "管理员正常登录"
data:
username: "${credentials.admin.username}"
password: "${credentials.admin.password}"
expected:
code: 200
message: "success"
- case_id: "TC-LOGIN-02"
description: "错误密码登录"
data:
username: "${credentials.admin.username}"
password: "wrong_password"
expected:
code: 401
message: "invalid password"
步骤3:Python测试脚本解析YAML
import yaml
import pytest
# 加载YAML文件
def load_yaml(file_path):
with open(file_path) as f:
return yaml.safe_load(f)
# 动态生成测试用例
@pytest.mark.parametrize("case", load_yaml("test_cases/login_test.yaml")["test_cases"])
def test_login(case):
# 模拟实际测试逻辑
response = fake_api_login(case["data"])
# 断言验证
assert response["code"] == case["expected"]["code"]
assert case["expected"]["message"] in response["text"]
print(f"测试通过: {case['description']}")
# 伪代码:模拟API调用
def fake_api_login(data):
if data["password"] == "wrong_password":
return {"code":401, "text":"invalid password"}
return {"code":200, "text":"success"}
执行结果
$ pytest -v
=========================
test_login.py::test_login[TC-LOGIN-01] PASSED [50%]
test_login.py::test_login[TC-LOGIN-02] PASSED [100%]
YAML使用高频避坑指南
-
缩进陷阱
- 必须使用空格(严禁Tab键)
- 同级元素缩进必须对齐
-
特殊字符处理
# 错误:未转义冒号 key: "value:contains:colon" # ❌ 解析错误 # 正确:用引号包裹 key: "value:contains:colon" # ✅
-
数据类型混淆
version: 1.0 # 浮点数 → 1.0 version: "1.0" # 字符串 → "1.0" is_prod: true # 布尔值 → True (Python)
-
大文件优化技巧
# 避免超过500行(拆分多个文件) # 使用锚点减少重复代码
「小贴士」:点击头像→【关注】按钮,获取更多软件测试的晋升认知不迷路! 🚀