如何在pytest-bdd中为场景定义待操作的数据集?
如何在pytest-bdd中为场景定义待操作的数据集?
我太懂你这种需求了!之前用behave的时候,能把数据集直接写在feature文件里,谁看用例都能一眼明白要处理啥数据,换到pytest-bdd也完全能实现,而且用法还挺顺手的,我给你捋清楚:
首先,在你的feature文件里,直接用表格语法给对应的步骤附加数据集就好,和behave的写法几乎一模一样:
Feature: 批量用户管理 Scenario: 批量导入指定用户 Given 有一组待导入的用户信息 | name | department | | 张三 | 技术研发部 | | 李四 | 市场营销部 |
接下来是步骤定义部分,这里和behave有一点小区别:pytest-bdd会直接把表格作为参数传给步骤函数,而不是存在context对象里。你可以这么写:
from pytest_bdd import given, when, scenario # 把表格数据转成方便后续使用的格式,用target_fixture传递给其他步骤 @given("有一组待导入的用户信息", target_fixture="import_user_data") def step_given_import_users(table): # 将表格的每一行转成字典,返回后作为fixture供后续步骤调用 return [dict(row.items()) for row in table] # 后续步骤直接引用fixture名称就能拿到数据集 @when("执行批量导入用户操作") def step_when_execute_import(import_user_data): for user in import_user_data: # 这里替换成你实际的业务逻辑,比如存入数据库 print(f"添加用户:{user['name']},部门:{user['department']}")
再给你拆解几个关键点:
- 表格里的每一行数据会被封装成类似字典的对象,你可以直接通过列名取值,和behave里的row用法完全一致
- 用
target_fixture可以把处理好的数据集直接传递给后续步骤,不用手动管理上下文,比behave的context传递更简洁 - 这种写法完全保留了“数据在feature文件里可见”的优势,看用例的人不用翻代码就能清楚知道要处理哪些数据
最后提个小提醒:表格的列名要和你在代码里取值的键严格对应,不然会出现键不存在的问题;如果不同步骤需要不同数据集,直接在对应步骤下加独立表格就行,pytest-bdd会自动把对应表格传给对应步骤函数。
备注:内容来源于stack exchange,提问作者jamiet
相关产品推荐
相关产品推荐

