BDD - Python Behave Tags 过滤

BDD - Python Behave Tags 过滤

  • 引言
  • 实例
    • 创建 feature 文件
    • 创建 step 实现
  • Tag 过滤执行
    • 执行单个标签 --tags=tagname
    • 执行多个标签 OR 关系 --tags=tag1,tag2
    • 多个标签 AND 关系 --tags=tag1 --tags=tag2
    • 单标签非关系 --tags = ~tagname

引言

随着项目进展,QA 创建的 Behave 测试用例也会越来越多,我们通常者会加一些 Tags 来分类管理这些海量测试用例。当然我们在执行 Behave 测试用例时,也可以按 Tag 过滤执行,今天通过实例来了解一下 Behave 的 Tags 过滤。

实例

如果你还不太了解 Behave,请先阅读《BDD - Python Behave 入门》,这里我就不重复了,直接上代码吧,购物车的例子。

BDD - Python Behave Tags 过滤_第1张图片

创建 feature 文件

创建一个 shopping_cart.feature, 为每个 Scenario 加了一些 Tags

# shopping_cart.feature

Feature: Shopping Cart and Order Process

  @cart @smoke
  Scenario: Guest user adds items to the cart
    Given the user is on the home page
    When the user adds an item to the cart
    Then the user should see the item in the cart

  @cart @regression
  Scenario: Registered user removes items from the cart
    Given the user is logged in
    And the user has items in the cart
    When the user removes an item from the cart
    Then the user should see the updated cart

  @order @smoke
  Scenario: Guest user places an order
    Given the user is on the home page
    When the user adds an item to the cart
    And the user proceeds to checkout
    And the user completes the order
    Then the user should receive an order confirmation

  @order @regression
  Scenario: Registered user tracks an order
    Given the user is logged in
    And the user has placed an order
    When the user checks the order status
    Then the user should see the current order status

创建 step 实现

创建 shopping_cart_steps.py 文件

# shopping_cart_steps.py
from behave import given, when, then

class ShoppingCart:
    def __init__(self):
        self.cart_items = []
        self.is_logged_in = False
        self.checkout_completed = False
        self.order_placed = False

    def add_item_to_cart(self, item):
        self.cart_items.append(item)

    def remove_item_from_cart(self, item):
        self.cart_items.remove(item)

    def proceed_to_checkout(self):
        self.checkout_completed = True

    def complete_order(self):
        self.order_placed = True

    def check_order_status(self):
        return "Shipped" if self.order_placed else "Pending"

@given('the user is on the home page')
def step_given_user_on_home_page(context):
    context.shopping_cart = ShoppingCart()

@given('the user is logged in')
def step_given_user_logged_in(context):
    context.shopping_cart = ShoppingCart()
    context.shopping_cart.is_logged_in = True

@given('the user has items in the cart')
def step_given_user_has_items_in_cart(context):
    context.shopping_cart.add_item_to_cart("Sample Item")

@when('the user adds an item to the cart')
def step_when_user_adds_item(context):
    context.shopping_cart.add_item_to_cart("Sample Item")

@when('the user removes an item from the cart')
def step_when_user_removes_item(context):
    context.shopping_cart.remove_item_from_cart("Sample Item")

@when('the user proceeds to checkout')
def step_when_user_proceeds_to_checkout(context):
    context.shopping_cart.proceed_to_checkout()

@when('the user completes the order')
@given('the user has placed an order')
def step_when_user_completes_order(context):
    context.shopping_cart.complete_order()

@when('the user checks the order status')
def step_when_user_checks_order_status(context):
    context.order_status = context.shopping_cart.check_order_status()

@then('the user should see the item in the cart')
def step_then_user_sees_item_in_cart(context):
    assert "Sample Item" in context.shopping_cart.cart_items, "Item not found in the cart"

@then('the user should see the updated cart')
def step_then_user_sees_updated_cart(context):
    assert not context.shopping_cart.cart_items, "Cart is not empty as expected"

@then('the user should receive an order confirmation')
def step_then_user_receives_order_confirmation(context):
    assert context.shopping_cart.order_placed, "Order confirmation not received"

@then('the user should see the current order status')
def step_then_user_sees_current_order_status(context):
    assert context.order_status == "Shipped", f"Unexpected order status: {context.order_status}"

Tag 过滤执行

执行单个标签 --tags=tagname

只要运行标记 @smoke 的所有 cases,只需在 Behave 执行命令加上 --tags=smoke
执行命令:behave Features/tag_example --tags=smoke -f behave_html_formatter:HTMLFormatter -o report.html

PS C:\Automation\Test\bdd> behave Features/tag_example --tags=smoke -f behave_html_formatter:HTMLFormatter -o report.html
1 feature passed, 0 failed, 0 skipped
2 scenarios passed, 0 failed, 2 skipped
8 steps passed, 0 failed, 8 skipped, 0 undefined
Took 0m0.007s

查看 html report,就只有两个标记为 @smoke 的 Scenarios 执行了,剩下的都被 skipped 了。

BDD - Python Behave Tags 过滤_第2张图片

执行多个标签 OR 关系 --tags=tag1,tag2

可以通过用逗号 , (逻辑’ OR ')分隔标签名来同时执行 2 个标签。因此,下面我们运行那些标记为 @smoke 或 @cart 的测试用例,只需用逗号分开 tags, --tags=smoke,cart

执行命令:behave Features/tag_example --tags=smoke,cart -f behave_html_formatter:HTMLFormatter -o report.html

PS C:\Automation\Test\bdd> behave Features/tag_example --tags=smoke,cart -f behave_html_formatter:HTMLFormatter -o report.html
1 feature passed, 0 failed, 0 skipped
3 scenarios passed, 0 failed, 1 skipped
12 steps passed, 0 failed, 4 skipped, 0 undefined
Took 0m0.000s

查看 html report,标记为 @smoke 或 @cart 的 Scenarios 执行了,剩下的都被 skipped 了。

BDD - Python Behave Tags 过滤_第3张图片
而官方推荐的 --tags=“@tag1 or @tag2” 实践下来无效,不知是不是版本问题。

PS C:\Automation\Test\bdd> behave Features/tag_example --tags="@smoke or @cart" -f behave_html_formatter:HTMLFormatter -o report.html
0 features passed, 0 failed, 1 skipped
0 scenarios passed, 0 failed, 4 skipped
0 steps passed, 0 failed, 16 skipped, 0 undefined
Took 0m0.000s

多个标签 AND 关系 --tags=tag1 --tags=tag2

只想运行标记为 @smoke 并且标记为 @cart 的测试用例,–tags=smoke --tags=cart
执行命令:behave Features/tag_example --tags=smoke --tags=cart -f behave_html_formatter:HTMLFormatter -o report.html

PS C:\Automation\Test\bdd> behave Features/tag_example --tags=smoke --tags=cart -f behave_html_formatter:HTMLFormatter -o report.html
1 feature passed, 0 failed, 0 skipped
1 scenario passed, 0 failed, 3 skipped
3 steps passed, 0 failed, 13 skipped, 0 undefined
Took 0m0.000s

查看 html report,标记为 @smoke 且标记为 @cart 的 Scenarios 执行了,剩下的都被 skipped 了。

BDD - Python Behave Tags 过滤_第4张图片

而官方推荐的 --tags=“@tag1 and @tag2” 实践下来无效。

PS C:\Automation\Test\bdd> behave Features/tag_example --tags="@smoke and @cart" -f behave_html_formatter:HTMLFormatter -o report.html
0 features passed, 0 failed, 1 skipped
0 scenarios passed, 0 failed, 4 skipped
0 steps passed, 0 failed, 16 skipped, 0 undefined
Took 0m0.000s

单标签非关系 --tags = ~tagname

只想运行标记非 @smoke 的 cases,我们需要在 tag 前面加是破浪号 ~, --tags=~smoke
执行命令:behave Features/tag_example --tags=~smoke -f behave_html_formatter:HTMLFormatter -o report.html

PS C:\Automation\Test\bdd> behave Features/tag_example --tags=~smoke -f behave_html_formatter:HTMLFormatter -o report.html
1 feature passed, 0 failed, 0 skipped
2 scenarios passed, 0 failed, 2 skipped
8 steps passed, 0 failed, 8 skipped, 0 undefined
Took 0m0.000s

查看 html report,非 @smoke 标记的 Scenarios 执行了,剩下的都被 skipped 了。

BDD - Python Behave Tags 过滤_第5张图片
而官方推荐的 --tags=“not @tag” 我实践无效。

PS C:\Automation\Test\bdd> behave Features/tag_example --tags="not @smoke" -f behave_html_formatter:HTMLFormatter -o report.html
0 features passed, 0 failed, 1 skipped
0 scenarios passed, 0 failed, 4 skipped
0 steps passed, 0 failed, 16 skipped, 0 undefined
Took 0m0.000s

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