Pytest-Bdd-Playwright 系列教程(9):datatable 参数的使用
- 前言
- 一、什么是 `datatable` 参数?
- Gherkin 表格示例
- 二、`datatable` 参数的基本使用
- feature文件:获取用户信息并执行相关操作的
- 使用 `datatable` 处理表格数据
- `Given` 步骤:处理用户数据
- `When` 步骤:分配角色
- `Then` 步骤:验证权限
前言
pytest-bdd
在编写复杂的 Gherkin 场景时,往往会涉及到大量的表格数据。为了方便地管理和操作这些表格数据,pytest-bdd
提供了一个非常有用的功能——datatable
参数。
一、什么是 datatable
参数?
datatable
参数是 pytest-bdd
中提供的一种特殊参数类型,用于处理 Gherkin 场景中定义的表格数据。Gherkin 语言中的表格通常用于提供一组结构化的输入数据或期望的结果数据。当测试场景需要处理多个数据行时,数据表是一种非常有效的方式。datatable
参数正是用来将这些数据表传递到测试步骤函数中的。
在 pytest-bdd
中,datatable
参数返回的是一个二维列表,其中每一行表示 Gherkin 表格中的一行数据,行与行之间通过列表的方式进行存储。
Gherkin 表格示例
假设我们在 Gherkin 场景中定义了如下的用户数据表:
Given the following user details:
| name | email | age |
| John | john@example.com | 30 |
| Alice | alice@example.com | 25 |
在这个场景中,我们定义了一个包含姓名、邮箱和年龄的表格。当我们将这个表格传递到 pytest-bdd
测试步骤中时,它会变成以下结构:
[
["name", "email", "age"],
["John", "john@example.com", 30],
["Alice", "alice@example.com", 25]
]
这就是 datatable
参数在测试步骤中的表现形式。可以看到,datatable
参数将每一行表格数据作为一个列表传递给测试函数,使得你可以像处理普通的 Python 列表一样操作这些数据。
二、datatable
参数的基本使用
在使用 pytest-bdd
编写自动化测试时,datatable
参数通常和 Gherkin 中的表格配合使用。在步骤定义中,我们通过 datatable
参数将表格数据传递给测试函数,并在测试中进行处理。
feature文件:获取用户信息并执行相关操作的
假设我们有一个场景,要求在系统中创建多个用户并赋予不同的角色。我们可以通过以下 Gherkin 场景来定义数据表:
Feature: 用户账户管理
Scenario: 创建新用户并分配角色
Given the following user details:
| name | email | age |
| John | john@example.com | 30 |
| Alice | alice@example.com | 25 |
When each user is assigned the following roles:
| role | description |
| Admin | 系统的完全访问权限 |
| Contributor | 可以添加内容 |
And the page is saved
Then the user should have the following permissions:
| permission | allowed |
| view dashboard | true |
| edit content | true |
| delete content | false |
在这个场景中,我们首先定义了一个包含用户详细信息的表格(Given the following user details
),然后在 When
步骤中,我们为每个用户分配了不同的角色,最后在 Then
步骤中,我们验证每个用户是否拥有正确的权限。
使用 datatable
处理表格数据
首先,我们需要导入 pytest-bdd
提供的步骤装饰器,并定义每个步骤对应的处理函数。
Given
步骤:处理用户数据
在 Given
步骤中,我们需要处理 Gherkin 场景中定义的用户数据表。通过 datatable
参数,我们可以将每一行数据提取出来并存储在一个列表中。
from pytest_bdd import given, when, then
@given("the following user details:", target_fixture="users")
def _(datatable):
users = []
for row in datatable[1:]: # 跳过表头
users.append({
'name': row[0],
'email': row[1],
'age': row[2]
})
print(users)
return users
在这个步骤中,我们首先跳过表头(datatable[1:]
),然后将每一行数据转换为字典形式,最后将所有用户数据返回。
When
步骤:分配角色
在 When
步骤中,我们需要将每个用户分配角色。通过 datatable
参数,我们可以获得角色数据,并遍历每个用户,进行角色分配。
@when("each user is assigned the following roles:")
def _(datatable, users):
for user in users:
for role_row in datatable:
assign_role(user, role_row[0], role_row[1])
在这个步骤中,我们遍历每个用户,并为每个用户分配角色。datatable
包含了角色信息,我们通过 role_row[0]
和 role_row[1]
获取角色名称和描述,并调用 assign_role
函数进行分配。
Then
步骤:验证权限
在 Then
步骤中,我们需要验证每个用户是否拥有正确的权限。datatable
参数再次用于提供期望的权限数据,并将其与每个用户的实际权限进行对比。
@then("the user should have the following permissions:")
def _(datatable, users):
expected_permissions = []
for row in datatable[1:]: # 跳过表头
expected_permissions.append({
'permission': row[0],
'allowed': row[1]
})
assert users_have_correct_permissions(users, expected_permissions)
在这个步骤中,我们首先提取期望的权限数据,并将其存储为字典列表。然后,使用 assert
语句验证每个用户的权限是否与期望值一致。