使用 Python 开发 BDD 项目
Pytest-BDD 是一种基于 Pytest 测试框架的行为驱动开发(BDD)框架。它结合了 pytest 的简洁高效和 Gherkin 语言的直观表达方式,使得测试代码更易读、更具表达力。本教程将引导您将自动化代码、应用模型文件和 BDD 场景文件整合,构建完整的 Pytest-BDD 自动化测试项目。
CukeTest内置了对pytest-bdd的支持,详情请参见 Pytest-BDD 使用指南。
如何编写 Pytest-BDD 测试脚本
在 Pytest-BDD 中,测试脚本用于实现 Gherkin 场景中的步骤。
1. 创建测试脚本文件
首先,打开项目 step_defs
目录中的 test_feature1.py
文件。这个文件在创建项目时会自动生成,您也可以在项目中的任意位置创建新的测试脚本文件。请确保文件名以 test_
开头,以便 Pytest 正确识别为测试文件。例如,test_notepad.py
。
2. 关联场景文件
测试脚本的第一步是关联 Gherkin 场景文件。通过 scenarios()
函数加载我们的示例场景,这样 Pytest-BDD 就能够找到对应的测试场景:
scenarios("../features/notepad.feature")
3. 定义步骤函数
步骤定义函数是执行自动化测试的具体代码,用于实现场景中的各项操作。在 Pytest-BDD 中,每个 Gherkin 步骤(如 假如
、当
、那么
)通过 Python 函数实现。利用 @given
、@when
和 @then
装饰器,您可以将这些步骤关联到具体的 Python 函数。
通过前面的录制脚本,我们已经生成了这个测试场景所需的所有自动化操作代码和检查点代码,接下来只需将录制的代码按照操作步骤的顺序,分别实现对应步骤定义函数即可。
提示:对于桌面自动化测试,在编写步骤定义函数时,需要确保已经加载桌面自动化模块(如:
WinAuto
),以及对应的模型文件。
3.1 编写无参数的步骤函数
例如,打开记事本应用的步骤:
@given("打开记事本应用")
def open_notepad():
Util.launchProcess(r"C:\Program Files\LeanPro\CukeTest\bin\notepad.exe")
在这里,@given
装饰器将 "打开记事本应用"
这一步与 open_notepad()
函数关联起来。
3.2 编写带参数的步骤函数
对于带参数的步骤,您可以使用 parsers.parse()
提取变量。例如,下面的代码展示了如何将 {text}
作为变量从 Gherkin 步骤传递到 Python 函数:
@when(parsers.parse('在编辑区输入"{text}"'), target_fixture="expected_text")
def input_text(text):
modelWin.getEdit("QTextEdit").set(text)
return text
在此示例中,parsers.parse()
从步骤文本中提取 {text}
,并将其作为 text
参数传递到 input_text()
函数。
3.3 使用 target_fixture
跨步骤传递数据
有时需要在后续步骤中访问前面的参数。使用 target_fixture
可以让该参数在后续步骤中调用。例如,在下一个步骤中检查输入的文字是否正确:
@then("检查输入的文字是否正确")
def check_text(expected_text):
modelWin.getEdit("QTextEdit").checkProperty("Text.text", expected_text)
在此示例中,target_fixture="expected_text"
将 input_text()
的返回值存储为 expected_text
,供 check_text()
使用。
完整的测试脚本示例
最终的 test_feature1.py
文件示例如下:
# test_feature1.py
from pytest_bdd import scenarios, given, when, then, parsers
from leanproAuto import RunSettings, WinAuto, Util
import os
RunSettings.set({"slowMo": 1000, "reportSteps": True})
modelWin = WinAuto.loadModel(os.path.dirname(os.path.realpath(__file__)) + "/notepad.tmodel")
# 加载 BDD 场景文件
scenarios("../features/notepad.feature")
@given("打开记事本应用")
def open_notepad():
Util.launchProcess(r"C:\Program Files\LeanPro\CukeTest\bin\notepad.exe")
@when(parsers.parse('在编辑区输入"{text}"'), target_fixture="expected_text")
def input_text(text):
modelWin.getEdit("QTextEdit").set(text)
return text
@then("检查输入的文字是否正确")
def check_text(expected_text):
modelWin.getEdit("QTextEdit").checkProperty("Text.text", expected_text)
@when("修改字体大小为36")
def change_font_size():
modelWin.getButton("Font").click()
modelWin.getList("QFontListView").select("36")
modelWin.getButton("OK").click()
@then("检查字体是否修改成功")
def check_font_size_change():
modelWin.getVirtual("QTextEdit_image").checkImage()
@then("关闭记事本应用")
def close_notepad():
modelWin.getButton("关闭").click()
运行测试项目并查看报告
在 CukeTest 中,点击 运行项目 按钮可以执行所有测试脚本。CukeTest 会自动识别并运行符合 Pytest-BDD 规范的测试文件,并生成包含测试摘要和详细结果的测试报告:
- 测试摘要:列出测试总数、通过和失败的数量等。
- 详细结果:每个步骤的执行状态(如通过或失败),帮助定位问题。
测试报告还支持自定义截图或其他附件,以丰富上下文信息。参考 pytest-bdd 中的报告附件 以了解更多。