Pytest-Bdd-Playwright 系列教程(9):使用 数据表(DataTable 参数) 来传递参数
- 前言
- 一、什么是 `datatable` 参数?
- Gherkin 表格示例
- 二、`datatable` 参数的基本使用
- 三、完整代码和运行效果
- 完整的测试代码
前言
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
文件和 pytest
脚本:
example.feature
文件:
Feature: 计算器
Scenario: 批量计算两数相加或相减
Given 我已经准备好计算器
And 以下数据需要进行计算:
| 第一个数字 | 第二个数字 | 操作 | 预期结果 |
| 5 | 3 | 加法 | 8 |
| 10 | 4 | 减法 | 6 |
| 7 | 2 | 加法 | 9 |
When 执行所有计算
Then 计算结果应该正确
test_calculator.py
文件:
import pytest
from pytest_bdd import given, when, then, scenarios
scenarios("example.feature")
@given("我已经准备好计算器")
def _():
print("计算器已准备好!")
@given("以下数据需要进行计算:", target_fixture="calculations")
def _(datatable):
calculations = []
for row in datatable[1:]: # 跳过表头
calculations.append({
"first_number": int(row[0]),
"second_number": int(row[1]),
"operation": row[2],
"expected_result": int(row[3]),
})
return calculations
@when("执行所有计算", target_fixture="results")
def _(calculations):
results = []
for calc in calculations:
if calc["operation"] == "加法":
result = calc["first_number"] + calc["second_number"]
elif calc["operation"] == "减法":
result = calc["first_number"] - calc["second_number"]
else:
raise ValueError(f"不支持的操作: {calc['operation']}")
results.append(result)
return results
@then("计算结果应该正确")
def _(results, calculations):
for i, calc in enumerate(calculations):
assert results[i] == calc["expected_result"], (
f"计算错误:输入数据 {calc} 的结果 {results[i]} 不等于预期值 {calc['expected_result']}"
)
运行测试时,pytest-bdd
会自动解析 datatable
表格,并完成对应的计算和验证。
通过 datatable
参数,我们可以轻松实现批量化、结构化的测试流程,有效提升测试的覆盖率和代码的可维护性。