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 入门》,这里我就不重复了,直接上代码吧,购物车的例子。

在这里插入图片描述

创建 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 了。

在这里插入图片描述

执行多个标签 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 了。

在这里插入图片描述
而官方推荐的 --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 了。

在这里插入图片描述

而官方推荐的 --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 了。

在这里插入图片描述
而官方推荐的 --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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/265868.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JMeter】使用BeanShell写入内容到文件

一、前言 ​ 在我们日常工作中,可能会遇到需要将请求返回的数据写入到文件中。在我们使用JMeter进行性能测试时,就经常能够遇到这种情况。要想达到这种目的,我们一般采取BeanShell后置处理器来将内容写入到文件。 二、提取 ​ 在目前大多数的…

记一次 Nginx 调参的踩坑经历

最近在基于SSE(Server Sent Events)做服务端单向推送服务,本地开发时一切顺利,但是在部署到预发环境时就碰到1个很诡异的问题,这里需要简单介绍下我们的整体架构: 整体架构 可以看到所有的请求都会先到统一…

2. 结构型模式 - 桥接模式

亦称: Bridge 意图 桥接模式是一种结构型设计模式, 可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构, 从而能在开发时分别使用 问题 抽象? 实现? 听上去挺吓人? 让我们慢慢来&#x…

2023年软件测试已经崩盘了吗?为什么很难找到工作?

最近后台很多粉丝给我留言: 2023年软件测试已经崩盘了吗,为什么都找不到工作了? 确实,今年经济大环境不好,企业也都在降本增效,如果技术能力还在被应届生竞争岗位的阶段,只会越来越难。 找不…

3d max高质量渲染时,硬件的要求有什么?

渲染过程中,想要追求,效果图高质量渲染,高效率渲染的过程中,3d max高清渲染不只是三维软件的一个要求,对于本地计算机的硬件要求配置也是很重要的。 今天,小编带大家来聊聊3d max高质量渲染过程中&#xff…

20 Vue3中使用v-for遍历普通数组

概述 使用v-for遍历普通数组在真实开发中还是比较常见的。 基本用法 我们创建src/components/Demo20.vue&#xff0c;代码如下&#xff1a; <script setup> const tags ["JavaScript", "Vue3", "前端"] </script> <template…

单例模式实现

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;JavaEE &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 单例模式 1. 什么是单例模式2. 饿汉模式3.…

机器学习的一些有趣的点【异常检测】

机器能不能知道自己不知道&#xff0c;而不是给出判断中的一种&#xff1f; Classifier&#xff08;分类&#xff09;Anomaly Detection&#xff08;异常检测&#xff09; 机器能不能说出为什么知道&#xff1f; 有时候可能是因为数据的问题导致了这种错觉。 机器学习是否会有错…

虾皮跨境电商的收款方式及选择指南

虾皮&#xff08;Shopee&#xff09;作为一家知名的跨境电商平台&#xff0c;为卖家提供了多种收款方式&#xff0c;以满足不同卖家的需求。本文将介绍虾皮跨境电商平台的主要收款方式&#xff0c;并提供选择指南&#xff0c;帮助卖家根据自身需求和目标市场选择最合适的收款方…

机器学习---K近邻算法

1. KNN算法 K近邻算法&#xff0c;即K-Nearest Neighbor algorithm&#xff0c;简称KNN算法&#xff0c;是一个理论上比较成熟的方法&#xff0c;也 是最简单的机器学习算法之一&#xff0c;1968年由 Cover 和 Hart 提出。 该方法的思路是&#xff1a;如果一个样本在特征空间…

人工智能中GAN 的五大有趣应用

引言 你能看出这张照片中面部的共同点吗&#xff1f; 这些人都不是真实存在的&#xff01;这些面部图像都是由 GAN 技术生成的。 “GAN” 这个词是由 Ian Goodfellow 在 2014 年提出的&#xff0c;但相关概念早在 1990 年就存在了&#xff08;Jrgen Schmidhuber 开创&#xf…

图像识别中的 Vision Transformers (ViT)

引言 Vision Transformers (ViT) 最近已成为卷积神经网络(CNN) 的竞争替代品&#xff0c;而卷积神经网络 (CNN) 目前在不同的图像识别计算机视觉任务中处于最先进的水平。ViT 模型在计算效率和准确性方面比当前最先进的 (CNN) 模型高出近 4 倍。 Transformer 模型已成为自然语…

【vtkWidgetRepresentation】第十七期 vtkDistanceRepresentation

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享vtkDistanceRepresentation相关内容,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 目录 前言 1. vtkDistanceRep…

ESP8266网络相框采用TFT_eSPI库TJpg_Decoder库mixly库UDP库实现图片传送

用ESP8266和TFT_ESPI模块来显示图片数据。具体来说&#xff0c;我们将使用ILI9431显示器作为显示设备&#xff0c;并通过UDP协议将图片数据从发送端传输到ESP8266。最后&#xff0c;我们将解析这些数据并在TFT屏幕上显示出来。在这个过程中&#xff0c;我们将面临一些编程挑战&…

SpringBoot+JaywayJsonPath实现Json数据的DSL(按照指定节点表达式解析json获取指定数据)

场景 若依前后端分离版手把手教你本地搭建环境并运行项目&#xff1a; 若依前后端分离版手把手教你本地搭建环境并运行项目_前后端分离项目本地运行-CSDN博客 在上面搭建SpringBoot项目的基础上&#xff0c;并且在项目中引入fastjson、hutool等所需依赖后。 Jayway JsonPat…

05. Springboot admin集成Actuator(一)

目录 1、前言 2、Actuator监控端点 2.1、健康检查 2.2、信息端点 2.3、环境信息 2.4、度量指标 2.5、日志文件查看 2.6、追踪信息 2.7、Beans信息 2.8、Mappings信息 3、快速使用 2.1、添加依赖 2.2、添加配置文件 2.3、启动程序 4、自定义端点Endpoint 5、自定…

【数据结构入门精讲 | 第十六篇】并查集知识点及考研408、企业面试练习

上一篇中我们进行了散列表的相关练习&#xff0c;在这一篇中我们要学习的是并查集。 目录 概念伪代码选择题填空题编程题7-1 朋友圈R7-1 笛卡尔树R7-2 部落R7-3 秀恩爱分得快 在许多实际应用场景中&#xff0c;我们需要对元素进行分组&#xff0c;并且在这些分组中进行查询和修…

常用Python自动化测试框架有哪些?优缺点对比

随着技术的进步和自动化技术的出现&#xff0c;市面上出现了一些自动化测试框架。只需要进行一些适用性和效率参数的调整&#xff0c;这些自动化测试框架就能够开箱即用&#xff0c;大大节省了测试时间。而且由于这些框架被广泛使用&#xff0c;他们具有很好的健壮性&#xff0…

代码随想录第三十九天(一刷C语言)|零钱兑换完全平方数

创作目的&#xff1a;为了方便自己后续复习重点&#xff0c;以及养成写博客的习惯。 一、零钱兑换 思路&#xff1a;参考carl文档 1、确定dp数组以及下标的含义&#xff1a;凑足总额为j所需钱币的最少个数为dp[j]。 2、确定递推公式&#xff1a;凑足总额为j - coins[i]的最…

先进制造身份治理现状洞察:从手动运维迈向自动化身份治理时代

在新一轮科技革命和产业变革的推动下&#xff0c;制造业正面临绿色化、智能化、服务化和定制化发展趋势。为顺应新技术革命及工业发展模式变化趋势&#xff0c;传统工业化理论需要进行修正和创新。其中&#xff0c;对工业化水平的判断标准从以三次产业比重标准为主回归到工业技…