BDD - Python Behave Hooks 钩子

BDD - Python Behave Hooks 钩子

  • 引言
  • Behave Hooks
  • Behave Hooks 实例
    • 创建 feature 文件
    • 创建 step 文件
    • 创建 Hooks environment.py 文件
    • 观察 Hooks 执行情况

引言

在自动化测试用例过程中,有时我们需要在执行测试用例前做一些前置工作,包括浏览器打开、数据库连接、配置等,执行结束后做一些清理工作,包括浏览器关闭、数据库连接终止、撤消更改等。或者执行一些特殊的 Feature/ Tag 的测试用例需要做一些特殊的处理, 我们可以借助 Hooks 也就是钩子机制来实现。今天就来了解一下 Behave Hooks,非常好用哟!

想了解更多 Behave 相关的文章,欢迎阅读《Python BDD Behave 系列》,持续更新中。

Behave Hooks

Behave Hooks 是 Behave 测试框架中的一种机制,用于在测试执行的不同阶段插入自定义行为。Hooks 提供了灵活的方式,可以在测试运行的不同阶段执行一些准备工作、清理工作,或者添加自定义逻辑。

通常,Behave Hooks 被定义在一个名为 environment.py 的文件中,该文件位于包含 steps 文件夹的同一目录中。这个文件中的 Hooks 将在整个测试运行期间起作用。Hooks 函数通常接收一个 context 参数,这是 Behave 测试运行时的上下文对象,提供了访问全局信息的途径。你可以在 Hooks 中使用 context 对象来共享数据、设置全局状态等,后续会专门介绍 context。

常见的 Behave Hooks 类型:

  1. before_all 和 after_all
    before_all(context) - 在整个测试运行之前执行,通常用于设置全局的测试环境。
    after_all(context) - 在整个测试运行结束后执行,用于清理全局测试环境。

  2. before_feature 和 after_feature
    before_feature(context, feature) - 在每个特性(Feature)运行之前执行。
    after_feature(context, feature) - 在每个特性(Feature)运行之后执行。

  3. before_scenario 和 after_scenario
    before_scenario(context, scenario) - 在每个场景(Scenario)运行之前执行。
    after_scenario(context, scenario) - 在每个场景(Scenario)运行之后执行。

  4. before_step 和 after_step
    before_step(context, step) - 在每个步骤(Step)运行之前执行。
    after_step(context, step) - 在每个步骤(Step)运行之后执行。

  5. before_tag 和 after_tag:
    before_tag(context, tag) - 在某个标签(Tag)运行前执行.
    after_tag(context, tag) - 在某个标签(Tag)运行后执行

Behave Hooks 实例

下面通过一个简单的实例更直接地理解 Hooks 的执行顺序, 方便以后将 Hooks 应用在具体项目中。

项目结构如下:

BDD - Python Behave Hooks 钩子_第1张图片

创建 feature 文件

这里我们加了一个 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

创建 step 文件

# 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}"

创建 Hooks environment.py 文件

注意 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")

观察 Hooks 执行情况

执行下面命令,运行上面的测试用例, 注意,运行 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

你可能感兴趣的:(#,Behave,python,Behave,BDD,Hooks,钩子)