YAML比Excel更轻量、易维护、少出错;仅当非技术人员必须编辑且只会用Excel时才选openpyxl。因YAML是纯文本,Git友好、无格式污染、读取快;Excel依赖第三方库、易版本报错、保存改元数据、空格/类型转换隐式出错。

直接说结论:用 pytest 做接口测试的数据驱动,YAML 比 Excel 更轻量、更易维护、更少出错;但如果你的测试数据必须由非技术人员(比如产品)编辑,且他们只会用 Excel,那才考虑 openpyxl —— 否则优先选 YAML。
为什么 YAML 比 Excel 更适合 pytest 数据驱动
YAML 文件本质是纯文本,Git 可 diff、可 merge、无格式污染、不锁文件、读取快;而 Excel 依赖第三方库(openpyxl 或 xlrd),容易因版本升级报错(比如 openpyxl 3.1+ 不再支持 .xls),且每次保存可能悄悄改二进制元数据,导致 Git 提交混乱。
常见错误现象:
-
openpyxl.utils.exceptions.InvalidFileException: openpyxl does not support .xls file format—— 用了老格式 Excel 却装了新版openpyxl -
PermissionError: [Errno 13] Permission denied: 'test_data.xlsx'—— Excel 文件被 Excel 程序占用,Python 打不开 - YAML 中写错缩进,
yaml.safe_load()直接抛YAMLError,错误位置明确;Excel 里空格、隐藏字符、类型自动转换(如把00123变成123)却无声无息,等断言失败才排查
用 pytest + YAML 加载接口测试数据的最小可行写法
核心就三步:装包、写 YAML、在 @pytest.mark.parametrize 里加载。不需要封装类、不用写单独的 load_data() 函数(除非数据逻辑复杂)。
立即学习“Python免费学习笔记(深入)”;
实操建议:
- 安装:
pip install pyyaml(别装yaml,那个是旧版,不安全) - YAML 文件(例如
data/api_login.yml)写成列表形式,每项是一个测试用例字典:- username: user1 password: pass1 expected_status: 200 - username: "" password: "pass2" expected_status: 400
- 测试文件中直接加载:
@pytest.mark.parametrize("case", yaml.safe_load(open("data/api_login.yml"))) def test_login_api(case): r = requests.post("https://api.example.com/login", json={ "username": case["username"], "password": case["password"] }) assert r.status_code == case["expected_status"]
注意:yaml.safe_load() 返回的是 Python list,所以 @pytest.mark.parametrize 的参数名(这里是 case)对应 list 中每个 dict;不用拆成多个参数,避免和 @unpack 混用增加复杂度。
Excel 方案只在必要时用,且必须绕开三个坑
如果真得用 Excel(比如测试数据要从现有业务表格导出),请严格按以下做,否则大概率卡在第一步:
- 只用
.xlsx格式,禁用.xls——openpyxl从 3.0 版起已完全放弃支持 - 第一行必须是字段名(如
url,method,json_body,expected_code),且不能有合并单元格、空行、前导空格 - 读取时加
values_only=True,否则拿到的是Cell对象,不是原始值:from openpyxl import load_workbook wb = load_workbook("data/api_cases.xlsx") sheet = wb.active for row in sheet.iter_rows(min_row=2, values_only=True): url, method, body, exp_code = row # 注意顺序要和 Excel 表头一致 # ……构造请求 - JSON 字段(如
json_body)在 Excel 里必须存成字符串,比如{"user":"test"},然后在代码里用json.loads(body)解析;别指望 Excel 能“识别” JSON 类型
最常被忽略的一点:YAML 和 Excel 都只是数据容器,真正决定是否“驱动成功”的,是你怎么把数据映射到请求构造和断言逻辑里。一个 case 字典里混着 URL、headers、body、expected 字段,比硬拆成七八个独立参数更可持续 —— 尤其当接口字段变多、校验规则变复杂时。



















