配置中心:管理测试环境/参数
# 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}"
# 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" # 新增字段
project/
├── config/
│ ├── env.yaml # 环境配置
│ └── users.yaml # 用户数据
├── test_cases/
│ └── login_test.yaml # 测试用例
└── test_login.py # 测试脚本
# env.yaml
prod:
base_url: "https://api.myapp.com"
timeout: 10
# users.yaml
credentials:
admin:
username: "[email protected]"
password: "S3cret!2024"
guest:
username: "[email protected]"
password: "TempP@ss"
# 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"
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%]
缩进陷阱
特殊字符处理
# 错误:未转义冒号
key: "value:contains:colon" # ❌ 解析错误
# 正确:用引号包裹
key: "value:contains:colon" # ✅
数据类型混淆
version: 1.0 # 浮点数 → 1.0
version: "1.0" # 字符串 → "1.0"
is_prod: true # 布尔值 → True (Python)
大文件优化技巧
# 避免超过500行(拆分多个文件)
# 使用锚点减少重复代码
「小贴士」:点击头像→【关注】按钮,获取更多软件测试的晋升认知不迷路!