在自动化测试用例过程中,有时我们需要在执行测试用例前做一些前置工作,包括浏览器打开、数据库连接、配置等,执行结束后做一些清理工作,包括浏览器关闭、数据库连接终止、撤消更改等。或者执行一些特殊的 Feature/ Tag 的测试用例需要做一些特殊的处理, 我们可以借助 Hooks 也就是钩子机制来实现。今天就来了解一下 Behave Hooks,非常好用哟!
想了解更多 Behave 相关的文章,欢迎阅读《Python BDD Behave 系列》,持续更新中。
Behave Hooks 是 Behave 测试框架中的一种机制,用于在测试执行的不同阶段插入自定义行为。Hooks 提供了灵活的方式,可以在测试运行的不同阶段执行一些准备工作、清理工作,或者添加自定义逻辑。
通常,Behave Hooks 被定义在一个名为 environment.py 的文件中,该文件位于包含 steps 文件夹的同一目录中。这个文件中的 Hooks 将在整个测试运行期间起作用。Hooks 函数通常接收一个 context 参数,这是 Behave 测试运行时的上下文对象,提供了访问全局信息的途径。你可以在 Hooks 中使用 context 对象来共享数据、设置全局状态等,后续会专门介绍 context。
常见的 Behave Hooks 类型:
before_all 和 after_all:
before_all(context) - 在整个测试运行之前执行,通常用于设置全局的测试环境。
after_all(context) - 在整个测试运行结束后执行,用于清理全局测试环境。
before_feature 和 after_feature:
before_feature(context, feature) - 在每个特性(Feature)运行之前执行。
after_feature(context, feature) - 在每个特性(Feature)运行之后执行。
before_scenario 和 after_scenario:
before_scenario(context, scenario) - 在每个场景(Scenario)运行之前执行。
after_scenario(context, scenario) - 在每个场景(Scenario)运行之后执行。
before_step 和 after_step:
before_step(context, step) - 在每个步骤(Step)运行之前执行。
after_step(context, step) - 在每个步骤(Step)运行之后执行。
before_tag 和 after_tag:
before_tag(context, tag) - 在某个标签(Tag)运行前执行.
after_tag(context, tag) - 在某个标签(Tag)运行后执行
下面通过一个简单的实例更直接地理解 Hooks 的执行顺序, 方便以后将 Hooks 应用在具体项目中。
项目结构如下:
这里我们加了一个 Tag @test_hooks_tag
# calculator.feature
Feature: Calculator Addition
In order to verify that the calculator can perform addition
As a user
I want to ensure that the addition operation is correct
@test_hooks_tag
Scenario: Add two numbers
Given the calculator is turned on
When I add 5 and 7
Then the result should be 12
# calculator_steps.py
from behave import given, when, then
@given('the calculator is turned on')
def step_calculator_turned_on(context):
context.calculator_on = True
@when('I add {num1:d} and {num2:d}')
def step_add_numbers(context, num1, num2):
context.result = num1 + num2
@then('the result should be {expected_result:d}')
def step_check_result(context, expected_result):
assert context.result == expected_result, f"Actual result: {context.result}, Expected result: {expected_result}"
注意 environment.py 文件跟 step 文件夹是同级的
# environment.py
from behave import *
def before_all(context):
print("Before all tests")
def before_feature(context, feature):
print(f"Before feature: {feature.name}")
def before_scenario(context, scenario):
print(f"Before scenario: {scenario.name}")
def before_tag(context, tag):
print(f"Before tag: {tag}")
def before_step(context, step):
print(f"Before step: {step.name}")
def after_step(context, step):
print(f"After step: {step.name}")
def after_tag(context, tag):
print(f"After tag: {tag}")
def after_scenario(context, scenario):
print(f"After scenario: {scenario.name}")
def after_feature(context, feature):
print(f"After feature: {feature.name}")
def after_all(context):
print("After all tests")
执行下面命令,运行上面的测试用例, 注意,运行 Behave 时,可以通过添加 --no-capture 选项来禁用输出捕获。这样,print 输出将直接显示在终端上。
命令:behave Features/Calculator –no-capture -f behave_html_formatter:HTMLFormatter -o report.html
Hooks 执行顺序就一目了然了,是不是很直观。
PS C:\Automation\Test\bdd> behave Features/Calculator --no-capture -f behave_html_formatter:HTMLFormatter -o report.html
Before all tests
Before feature: Calculator Addition
Before tag: test_hooks_tag
Before scenario: Add two numbers
Before step: the calculator is turned on
After step: the calculator is turned on
Before step: I add 5 and 7
After step: I add 5 and 7
Before step: the result should be 12
After step: the result should be 12
After scenario: Add two numbers
After tag: test_hooks_tag
After feature: Calculator Addition
After all tests
1 feature passed, 0 failed, 0 skipped
1 scenario passed, 0 failed, 0 skipped
3 steps passed, 0 failed, 0 skipped, 0 undefined
Took 0m0.000s