Python数据驱动测试中如何选取Excel指定列用于pytest参数化?
pytest+xlsx数据驱动按测试用例提取指定列的实现方案
不需要额外引入第三方库,基于你已经掌握的pytest参数化能力和Excel读取逻辑稍做改造即可实现需求:
核心思路
读取Excel时不要直接返回元组格式的行数据,先关联表头将每行数据转为字典格式,后续不同测试用例按需从字典中提取对应字段即可。
第一步:封装Excel读取工具,返回带字段映射的结构化数据
以openpyxl库为例,读取逻辑如下:
from openpyxl import load_workbook def load_excel_data(file_path: str, sheet_name: str = "Sheet1") -> list[dict]: wb = load_workbook(file_path) ws = wb[sheet_name] # 取第一行作为字段名 headers = [cell.value for cell in ws[1]] # 后续每行转为 字段名:值 格式的字典 data = [] for row in ws.iter_rows(min_row=2, values_only=True): row_dict = dict(zip(headers, row)) data.append(row_dict) return data
第二步:按用例需求提取指定字段做参数化
全局仅读取一次Excel数据,不同测试用例自行选取需要的字段:
import pytest from your_utils_path import load_excel_data # 全局加载一次全量测试数据,避免重复IO TEST_DATA = load_excel_data("./test_cases.xlsx") # 测试用例1:仅提取user、password字段做参数化 @pytest.mark.parametrize("user,password", [(item["user"], item["password"]) for item in TEST_DATA]) def test_user_login(user, password): # 登录测试逻辑 print(f"登录测试:账号={user}, 密码={password}") # 测试用例2:仅提取item_number、item_name字段做参数化 @pytest.mark.parametrize("item_number,item_name", [(item["item_number"], item["item_name"]) for item in TEST_DATA]) def test_item_query(item_number, item_name): # 商品查询测试逻辑 print(f"商品测试:编号={item_number}, 名称={item_name}")
进阶封装:自定义装饰器简化调用
如果不想每次都写列表推导逻辑,可以封装一个通用的字段提取参数化装饰器:
def parametrize_by_fields(fields: list[str], data_source: list[dict]): params = ",".join(fields) values = [tuple(item[field] for field in fields) for item in data_source] return pytest.mark.parametrize(params, values) # 调用时仅需指定需要的字段即可 @parametrize_by_fields(["user", "password"], TEST_DATA) def test_user_login(user, password): pass @parametrize_by_fields(["item_number", "item_name"], TEST_DATA) def test_item_query(item_number, item_name): pass
如果你习惯使用ddt库,也可以用相同逻辑实现
from ddt import ddt, data, unpack @ddt class TestSeleniumCase: # 提前处理对应场景需要的字段 login_test_data = [(item["user"], item["password"]) for item in TEST_DATA] item_test_data = [(item["item_number"], item["item_name"]) for item in TEST_DATA] @data(*login_test_data) @unpack def test_user_login(self, user, password): pass @data(*item_test_data) @unpack def test_item_query(self, item_number, item_name): pass
注意事项
- 全量Excel数据建议全局只读取一次,不要每个用例单独读取文件,减少不必要的IO开销
- 如果不同测试场景的数据源差异较大,可以拆分多个Excel sheet存储,和字段提取逻辑配合使用灵活度更高
- 可以在Excel读取逻辑中增加字段校验,避免测试用例指定不存在的字段时抛出异常
内容的提问来源于stack exchange,提问作者harmonybells
相关产品推荐
相关产品推荐

