当前位置: 首页 > news >正文

Pytest-Bdd vs Behave:选择最适合的 Python BDD 框架

Pytest-Bdd vs Behave:选择最适合的 Python BDD 框架

        • Pytest BDD vs Behave:选择最适合的 Python BDD 框架
        • BDD 介绍
        • Python BDD 框架列表
        • Python Behave
        • Pytest BDD
        • Pytest BDD vs Behave:关键区别
        • Pytest BDD vs Behave:最佳应用场景
        • 结论

在选择适合你需求的 Python BDD 框架时,本文将通过深入的 Pytest BDD 与 Behave 比较,帮助你做出明智的决策。
在这里插入图片描述

Pytest BDD vs Behave:选择最适合的 Python BDD 框架

和所有流行的编程语言一样,Python 也有许多可供选择的 BDD 框架。在这些框架中,Pytest BDD 和 Behave 是最为广泛使用的两个框架。作为一家领先的自动化测试公司,我们根据项目的业务需求使用了 Pytest BDD 和 Behave。我们认为,对于每个测试人员来说,了解如何实现一个可读且业务友好的自动化测试解决方案至关重要。因此,本文将通过对比 Pytest BDD 和 Behave,帮助你选择最适合的框架。

如果你不熟悉或刚接触 Python 和 BDD,我们将首先进行简单的介绍,然后再开始 Pytest BDD 与 Behave 的对比。如果你已经熟悉它们,可以直接跳到比较部分。

BDD 介绍

行为驱动开发(BDD)是一种敏捷软件开发技术,为了促进开发人员、测试人员与非技术或业务相关人员之间的协作。BDD 通过采用简单的“Given(给定)、When(当)、Then(那么)”格式(Gherkin 语言)来编写测试用例,使得任何人都能够理解。在进行 Pytest BDD 与 Behave 比较之前,让我们先看一下 Python 中常见的 BDD 框架。

Python BDD 框架列表
  1. Behave
  2. Pytest BDD
  3. radish
  4. lettuce
  5. freshen

虽然还有其他 Python BDD 框架,但这些是最为知名和广泛使用的选项。不过需要注意的是,并非所有 BDD 框架都适合每个人,因此我们选择了 Pytest BDD 和 Behave 进行对比。

Python Behave

如果你有使用 Cucumber BDD 框架的经验,你会发现 Behave 在很多方面非常相似。但即使你是新手,Behave 也很容易上手。其主要原因在于 Behave 提供了良好的在线文档和简单易用的教程。我们将在介绍 Pytest BDD 与 Behave 的优缺点后,直接进入它们的比较部分。

优点:

  • 完全支持 Gherkin 编程语言。
  • 环境函数和 fixtures 简化了设置和清理工作。
  • 与 Django 和 Flask 集成良好。
  • 在 Python BDD 从业人员中被广泛使用。

缺点:

  • Behave 的社区支持相对有限。
  • 无法并行执行测试。
Pytest BDD

Pytest BDD 实现了 Gherkin 语言的一个子集,用于项目需求测试和行为驱动开发。使用 Pytest 编写的 fixtures 可以在特性步骤设置和操作中重用,并通过依赖注入实现真正的 BDD,避免了维护一个包含 Gherkin 命令副作用的上下文对象。

让我们先列出 Pytest BDD 的优缺点,再继续进行 Pytest BDD 与 Behave 的对比。

优点:

  • 与 Pytest 和所有主要的 Pytest 插件无缝集成。
  • Fixtures 是管理步骤之间上下文的极好方法。
  • 可以与其他 Pytest 测试一起运行过滤后的测试。
  • conftest.py 文件使得共享步骤定义和钩子更加简单。
  • 更好地支持数据驱动的测试和表格数据处理。

缺点:

  • 特性文件必须显式声明在步骤定义模块中(通过 “@scenario” 或 “scenarios” 函数)。
  • 场景大纲步骤必须以不同的方式解析。
  • 在特性文件之间共享步骤可能会有些麻烦。
Pytest BDD vs Behave:关键区别

以下是优化后的表格格式,特别是在项目结构部分进行了调整,使其更加清晰和易于阅读:

描述Pytest BDDPython Behave
定价免费开源免费开源
项目结构<项目根目录>
产品代码包
测试目录
    features
        *.feature
        step_defs
        __init__.py
        conftest.py
        test_*.py
     [pytest.ini, tox.ini, setup.cfg]
<项目根目录>
产品代码包
features
    *.feature
    environment.py
    steps
        *_steps.py
    [behave.ini, .behaverc, tox.ini, setup.cfg]
步骤定义文件命名语法步骤定义文件名应以“test”作为前缀或后缀,如 test_filename.py文件名可以是任何 .py 扩展名
测试目录命名语法测试目录应命名为 tests测试目录应命名为 features
IDE 支持仅支持 PyCharm 专业版,Visual Studio Code 等仅支持 PyCharm 专业版,Visual Studio Code 等
报告Pytest BDD 支持:
1. HTML 报告
2. Allure 报告(作为单独插件安装)
Behave 支持:
1. Allure 报告
2. JSON 报告
3. Junit 报告
并行执行支持并行执行不支持并行执行
测试运行器Pytest(作为单独插件安装)Behave(内置测试运行器)
社区支持良好良好
启动测试通过特定的步骤定义文件启动测试:
例如:pytest -k your_step_definition.py
通过特定的特性文件启动测试:
例如:behave features/your_feature.feature
通过标签运行使用关键字 -m 运行测试文件:
例如:pytest -m @yourTag
使用关键字 --tags 运行测试文件:
例如:behave --tags @yourTag
解析器场景大纲步骤需要单独解析无需单独解析场景大纲步骤
显式声明特性文件必须在步骤定义中显式声明:
通过 scenarios 函数
不需要在步骤定义中显式声明特性文件
Pytest BDD vs Behave:最佳应用场景

Pytest BDD:

  • 并行执行 – Behave 没有内建功能支持测试的并行执行。而曾经流行的框架 behave-parallel 也已经退役。因此,如果并行测试执行对你来说至关重要,Pytest BDD 绝对是更好的选择。
  • 统一单元和功能测试 – Pytest BDD 可以将单元测试和功能测试统一起来,减少了持续集成服务器配置的负担,并且可以重用测试设置。
  • HTML 报告 – 如果你需要 HTML 报告,而 Behave 不支持 HTML 报告,那么你必须选择 Pytest BDD。Pytest BDD 还支持 Allure 报告,这也是一种常用的报告类型。

Behave:

  • 易用性 – 如 Pytest BDD 与 Behave 比较表所示,Behave 在步骤定义命名方面更为简便,因为 Pytest 需要定义前缀或后缀。由于需要声明场景、实现场景大纲以及在 Pytest BDD 中共享步骤,Behave 通常更容易上手。它还内置了测试运行器,设置也更简单。
  • 日志输出 – 在 Behave 中,终端日志比 Pytest 更加详细。因为 Behave 运行的测试基于使用 Given、When、Then 格式编写的特性文件,所以可以很容易地识别出错误的位置。
结论

显然,Pytest BDD 和 Behave 各有优缺点。根据你的自动化测试需求,你可以使用我们的 Pytest BDD 与 Behave 对比表和建议来做出明智的选择。作为一家测试自动化服务提供商,我们在许多项目中主要使用了 Pytest BDD。如果你能够处理 Pytest BDD 的复杂性,它是一个非常不错的选择。如果不行,Behave 也可以作为一个很好的替代方案。

原文链接:https://codoid.com/automation-testing/pytest-bdd-vs-behave-pick-the-best-python-bdd-framework/

相关文章:

Pytest-Bdd vs Behave:选择最适合的 Python BDD 框架

Pytest-Bdd vs Behave&#xff1a;选择最适合的 Python BDD 框架 Pytest BDD vs Behave&#xff1a;选择最适合的 Python BDD 框架BDD 介绍Python BDD 框架列表Python BehavePytest BDDPytest BDD vs Behave&#xff1a;关键区别Pytest BDD vs Behave&#xff1a;最佳应用场景结…...

Unity3D Shader变体自定义组合压缩方案详解

前言 在Unity3D中&#xff0c;Shader变体&#xff08;Shader Variants&#xff09;是指根据不同条件生成的Shader版本。这些条件可以包括材质属性、光照模型、阴影选项、渲染队列、纹理类型等。Shader变体允许开发者为同一Shader提供多种实现方式&#xff0c;以满足不同的渲染…...

QT使用promoted后样式(setStyleSheet)不生效问题解决

1.理解promoted&#xff08;提升&#xff09;在 Qt 中的概念 在 Qt Designer 中&#xff0c;“提升&#xff08;Promoted&#xff09;” 是一种机制&#xff0c;它允许你使用自定义的部件类来替代标准的 Qt 部件类。这在你已经创建了一个从标准 Qt 部件&#xff08;如QListWid…...

Vue3有哪些好用的处理大数据量虚拟表格组件呢?

在 Vue 3 中&#xff0c;处理大数据量的虚拟表格&#xff08;Virtual Table&#xff09;通常需要一个专门的组件或库来优化渲染性能&#xff0c;避免一次性渲染过多的 DOM 元素。以下是一些常用的虚拟表格组件&#xff0c;它们可以帮助你有效处理大数据量&#xff1a; 1. Vue …...

Java学习教程,从入门到精通,Java LinkedList(链表)语法知识点及案例代码(62)

Java LinkedList&#xff08;链表&#xff09;语法知识点及案例代码 一、LinkedList概述 LinkedList是Java集合框架中的一个类&#xff0c;位于java.util包中。它实现了List、Deque、Queue等接口&#xff0c;提供了链表数据结构的实现。链表是一种线性数据结构&#xff0c;其…...

设计模式——Singleton(单例)设计模式

摘要 本文介绍了单例设计模式的概念、实现和应用场景。单例模式确保某个类只有一个实例&#xff0c;节省资源并提供全局访问点。文章详细解释了单例模式的实现要素&#xff0c;包括私有构造方法、静态实例和公共静态方法&#xff0c;并探讨了其在数据库连接池、日志记录器和配…...

深入理解 CSS 文本换行: overflow-wrap 和 word-break

前言 正常情况下&#xff0c;在固定宽度的盒子中的中文会自动换行。但是&#xff0c;当遇到非常长的英文单词或者很长的 URL 时&#xff0c;文本可能就不会自动换行&#xff0c;而会溢出所在容器。幸运的是&#xff0c;CSS 为我们提供了一些和文本换行相关的属性&#xff1b;今…...

Java-27 深入浅出 Spring - 实现简易Ioc-03 在上节的业务下手动实现IoC

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 大数据篇正在更新&#xff01;https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了&#xff1a; MyBatis&#xff…...

kubernetes学习-使用metrics-server监控集群资源和查看日志

kubernetes学习-使用metrics-server监控集群资源和查看日志 一 、简介二、应用场景三、部署四、查看日志 一 、简介 Metrics Server 是一个用于 Kubernetes 集群的监控工具&#xff0c;它用于收集、存储和提供关于集群中各种资源的度量数据。Metrics Server 是 Kubernetes 中一…...

解决 Git Permission denied 问题

前言 push项目时出现gitgithub.com: Permission denied (publickey). fatal: Could not read from remote repository.Please make sure you have the correct access rights and the repository exists.出现这个问题表示你在尝试将本地代码推送到GitHub时&#xff0c;没有提供…...

CCNP_SEC_ASA 第三天作业

实验需求&#xff1a; ASA 使用列表放行 Outside 路由器到 DMZ 路由器的 WWW 流量并拒绝 Telnet 流量&#xff0c;当放行和拒绝流量匹配后产生日志通告。 提示&#xff1a;需要使能 ASA的日志功能和 DMZ路由器的 HTTP功能。 设备配置&#xff1a; ##此处展示各设备的配置&am…...

TypeError: Cannot read properties of null (reading ‘ce‘)

vue项目本地跑不起来&#xff0c;但是build之后能运行&#xff0c;本地报错 是因为你的vue版本不对&#xff0c;你的package可能是这样写的 这个表示你允许你的npm安装vue3的任意版本&#xff0c;但是build是按照这个版本来的&#xff0c;所以build之后能运行&#xff0c;本地运…...

AdminJS - 集成 MySQL 的现代化管理面板开发指南

AdminJS - 集成 MySQL 的现代化管理面板开发指南 MySQL 集成配置 首先需要安装必要的依赖&#xff1a; npm install adminjs adminjs/express express npm install adminjs/sequelize sequelize mysql2基础配置示例 const AdminJS require(adminjs) const AdminJSExpress …...

上传文件(vue3)

使用el-upload 先上传到文件服务器&#xff0c;生成url 然后点击确定按钮&#xff1a; 保存数据 <template><el-dialog top"48px" width"500" title"新增协议" :modelValue"visible" close"handleClose()">…...

【Win10 环境vscode配置boost】

文章目录 Boost exe版本windows环境安装vscode配置安装测试总结 Boost exe版本windows环境安装 这里不介绍boost源码安装&#xff0c;请自行网络搜索。本文要介绍的是window下单c文件&#xff08;cpp&#xff09;&#xff0c;调用boost库的执行配置。不涉及多文件。 安装文件下…...

中间件 redis安装

redis官网地址&#xff1a;Redis - The Real-time Data Platform 环境 CentOS Linux release 7.9.2009 (Core) java version "17.0.12" 2024-07-16 LTS 1、通过压缩包安装redis 1&#xff0c;远程下载redis压缩包&#xff0c;或去官网下载&#xff1a;Downloads …...

[java] 简单的熔断器scala语言案例

failureRateInterval时间内如果addEx(错误)达到 maxFailuresPerInterval 次数&#xff0c;则fused方法返回true,表示触发熔断&#xff0c;进入冷却期coolingInterval&#xff0c;冷却期内fused方法返回true&#xff0c;冷却期过后进入下一个错误统计周期。 scala语言完成 imp…...

【java】序列化的种类和使用场景

文章目录 序列化概述什么是序列化&#xff1f;序列化的作用 Java内置序列化java.io.Serializable接口使用ObjectOutputStream和ObjectInputStream优缺点分析 自定义序列化实现Externalizable接口自定义序列化方法适用场景 第三方序列化框架KryoProtobuf (Google Protocol Buffe…...

Qt5与Qt6中的高DPI缩放属性解析

在Qt5中&#xff0c;高DPI缩放默认是禁用的。为了启用它&#xff0c;开发者需要设置Qt::AA_EnableHighDpiScaling应用程序属性。然而&#xff0c;在Qt6中&#xff0c;高DPI缩放默认是启用的&#xff0c;并且不能被禁用。这种变化使得开发者在处理高分辨率屏幕时更加方便&#x…...

Mac使用总结

Mac 常用快捷键 复制&#xff1a;Cmdc粘贴&#xff1a;Cmdv只粘贴文档&#xff1a; ShiftCmdv行首&#xff1a; Cmd<行尾&#xff1a;Cmd>鼠标处选中到行首&#xff1a;ShiftCmd<鼠标处选中到行尾&#xff1a;ShiftCmd>选中整行&#xff1a;上面两个命令组合鼠标处…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...