YAML在自动化测试中的三大核心作用
YAML在自动化测试中的三大核心作用
-
配置中心:管理测试环境/参数
# config.yaml environments:dev: url: "http://dev.api.com"timeout: 5prod: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: 3306credentials: # 嵌套对象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: 200message: "success"- case_id: "TC-LOGIN-02"description: "错误密码登录"data:username: "${credentials.admin.username}"password: "wrong_password"expected:code: 401message: "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行(拆分多个文件) # 使用锚点减少重复代码
「小贴士」:点击头像→【关注】按钮,获取更多软件测试的晋升认知不迷路! 🚀