Pytest-Bdd-Playwright 系列教程(9):datatable 参数的使用

Pytest-Bdd-Playwright 系列教程(9):datatable 参数的使用

  • 前言
  • [一、什么是 `datatable` 参数?](#一、什么是 datatable 参数?)
    • [Gherkin 表格示例](#Gherkin 表格示例)
  • [二、`datatable` 参数的基本使用](#二、datatable 参数的基本使用)
    • feature文件:获取用户信息并执行相关操作的
    • [使用 `datatable` 处理表格数据](#使用 datatable 处理表格数据)
    • [`Given` 步骤:处理用户数据](#Given 步骤:处理用户数据)
    • [`When` 步骤:分配角色](#When 步骤:分配角色)
    • [`Then` 步骤:验证权限](#Then 步骤:验证权限)

前言

  • pytest-bdd 在编写复杂的 Gherkin 场景时,往往会涉及到大量的表格数据。为了方便地管理和操作这些表格数据,pytest-bdd提供了一个非常有用的功能------datatable 参数。

一、什么是 datatable 参数?

datatable 参数是 pytest-bdd 中提供的一种特殊参数类型,用于处理 Gherkin 场景中定义的表格数据。Gherkin 语言中的表格通常用于提供一组结构化的输入数据或期望的结果数据。当测试场景需要处理多个数据行时,数据表是一种非常有效的方式。datatable 参数正是用来将这些数据表传递到测试步骤函数中的。

pytest-bdd 中,datatable 参数返回的是一个二维列表,其中每一行表示 Gherkin 表格中的一行数据,行与行之间通过列表的方式进行存储。

Gherkin 表格示例

假设我们在 Gherkin 场景中定义了如下的用户数据表:

gherkin 复制代码
Given the following user details:
| name  | email             | age |
| John  | [email protected]   | 30  |
| Alice | [email protected]  | 25  |

在这个场景中,我们定义了一个包含姓名、邮箱和年龄的表格。当我们将这个表格传递到 pytest-bdd 测试步骤中时,它会变成以下结构:

python 复制代码
[
  ["name", "email", "age"],
  ["John", "[email protected]", 30],
  ["Alice", "[email protected]", 25]
]

这就是 datatable 参数在测试步骤中的表现形式。可以看到,datatable 参数将每一行表格数据作为一个列表传递给测试函数,使得你可以像处理普通的 Python 列表一样操作这些数据。

二、datatable 参数的基本使用

在使用 pytest-bdd 编写自动化测试时,datatable 参数通常和 Gherkin 中的表格配合使用。在步骤定义中,我们通过 datatable 参数将表格数据传递给测试函数,并在测试中进行处理。

feature文件:获取用户信息并执行相关操作的

假设我们有一个场景,要求在系统中创建多个用户并赋予不同的角色。我们可以通过以下 Gherkin 场景来定义数据表:

gherkin 复制代码
Feature: 用户账户管理
  Scenario: 创建新用户并分配角色
    Given the following user details:
      | name  | email             | age |
      | John  | [email protected]   | 30  |
      | Alice | [email protected]  | 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 参数,我们可以将每一行数据提取出来并存储在一个列表中。

python 复制代码
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 参数,我们可以获得角色数据,并遍历每个用户,进行角色分配。

python 复制代码
@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 参数再次用于提供期望的权限数据,并将其与每个用户的实际权限进行对比。

python 复制代码
@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 语句验证每个用户的权限是否与期望值一致。

相关推荐
互联网杂货铺2 小时前
完美搭建appium自动化环境
自动化测试·软件测试·python·测试工具·职场和发展·appium·测试用例
测试老哥8 小时前
Jmeter如何进行多服务器远程测试?
自动化测试·软件测试·功能测试·测试工具·jmeter·测试用例·性能测试
程序员杰哥13 小时前
Postman常见问题及解决方法
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·postman
Tom Boom16 小时前
Selenium自动下载浏览器驱动
自动化测试·webdriver·自动化测试框架开发·自动下载驱动
天才测试猿17 小时前
Postman接口测试之postman设置接口关联,实现参数化
自动化测试·软件测试·python·测试工具·职场和发展·接口测试·postman
FINE!(正在努力!)2 天前
PyTest框架学习
学习·pytest
程序员杰哥2 天前
接口自动化测试之pytest 运行方式及前置后置封装
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·pytest
互联网杂货铺2 天前
功能测试、性能测试、安全测试详解
自动化测试·软件测试·python·功能测试·测试工具·性能测试·安全性测试
测试老哥2 天前
Pytest+Selenium UI自动化测试实战实例
自动化测试·软件测试·python·selenium·测试工具·ui·pytest