PyTest BDD如何从外部Excel读取数据实现场景大纲批量测试
在PyTest BDD中用Excel批量数据替代Scenario Outline的Examples表格
核心思路是利用pytest的参数化机制,结合PyTest BDD的场景定义,实现逐条遍历Excel数据执行同一场景。具体步骤如下:
1. 编写Excel数据读取函数
用openpyxl或pandas实现批量读取,把每行数据转成字典(表头对应参数名),示例代码:
from openpyxl import load_workbook def read_excel_test_data(file_path): workbook = load_workbook(filename=file_path, read_only=True) sheet = workbook.active # 获取表头作为参数名 headers = [cell.value for cell in sheet[1]] test_data = [] # 遍历数据行,转成字典 for row in sheet.iter_rows(min_row=2, values_only=True): test_data.append(dict(zip(headers, row))) workbook.close() return test_data
2. 修改Feature文件
去掉Scenario Outline和Examples,改用普通Scenario保留参数占位符:
Feature: 浏览器测试 Scenario: 访问订单页面验证客户编号 When 访问 URL <base>/<page>/<ordNumber>/<custName> Then 页面包含客户编号 <custNumber>
3. 用pytest参数化绑定场景与数据
在step定义文件中,用@pytest.mark.parametrize装饰场景函数,将Excel数据逐条传入:
import pytest from pytest_bdd import scenario, when, then from your_utils import read_excel_test_data # 读取Excel中的测试数据 test_data = read_excel_test_data("test_data.xlsx") # 用参数化装饰场景,每条数据触发一次场景执行 @pytest.mark.parametrize("data", test_data) @scenario("features/browser_test.feature", "访问订单页面验证客户编号") def test_browser_order(data): pass @when("访问 URL <base>/<page>/<ordNumber>/<custName>") def visit_order_page(data, browser): # 假设browser是你定义的pytest浏览器fixture target_url = f"{data['base']}/{data['page']}/{data['ordNumber']}/{data['custName']}" browser.get(target_url) @then("页面包含客户编号 <custNumber>") def verify_cust_number(data, browser): assert str(data['custNumber']) in browser.page_source
关键注意事项
- Excel表头必须和Feature中的占位符完全一致(比如
base、page等),确保参数映射正确 - 如果偏好元组格式数据,可将参数化改为
@pytest.mark.parametrize("base, page, ordNumber, custName, custNumber", test_data),同时step函数需接收对应单独参数 - 必须参数化场景函数(即
@scenario装饰的函数),而非直接在step函数上参数化,这样才能实现逐条执行场景
内容的提问来源于stack exchange,提问作者Sara Ananth
相关产品推荐
相关产品推荐

