Python BDD 框架比较之 pytest-bdd vs behave

pytest-bddbehave是 Python 的两个流行的 BDD 测试框架,两者都可以用来编写用户故事和可执行的测试用例,
具体选择哪一个则需要根据实际的项目状况来看。
先简单看一下两者的功能:
pytest-bdd

  1. 基于pytest测试框架,可以与pytest的其他功能(例如 fixtures)一起使用。
  2. 提供了一种紧凑的步骤定义方式,可以通过装饰器定义并重复使用步骤。
  3. 支持参数化的测试,这样可以用同一组步骤进行多组数据的测试。

behave

  1. 基于 Python 的unittest测试框架。
  2. behave的步骤文件更加接近纯文本形式,对非编程人员更友好。
  3. 支持使用environment.py文件来定义在整个 test suite 运行前后需要进行的操作。

hehave

以下是behave的一些优点和特性:

  1. 适用于非技术团队成员:使用 Gherkin 语言,可以撰写更接近自然语言的测试场景描述,使得产品经理、商业分析师等非技术团队成员也能够理解、修改或编写测试场景。

  2. 环境控制behave提供了在测试运行前后设置和清理环境的功能,例如数据库初始化或数据清理等,只需要在environment.py文件里定义相应的函数即可。

  3. 可读性强和可维护性高behave强调的是实现从用户角度去描述系统行为的测试,这使得测试和实际用户需求更加贴合,增加了测试的可读性。而且将测试用例编写为人类可读的语言,可以提高代码的可维护性。

  4. 创造可共享的步骤:可以为常用的操作创建可重用的步骤,这样就能写出更加简洁、易于维护的测试代码。

  5. 对标/兼容 Cucumber:behave的 Gherkin 语言实现与宽广使用的 Cucumber 测试框架非常接近,这一点在迁移到或从 Cucumber 环境中迁出时会很有用。

  6. 与其他 Python 测试框架相容behave可与unittestdoctestnosepy.test等 Python 测试工具完美集成。

综上所述,behave提供了一种高度可读、可共享、适合大规模测试及非技术团队成员的 BDD 测试工具。

pytest-bdd 与 behave的比较

behavepytest-bdd都是 Python 下常用的为支持 BDD(行为驱动开发)流程而设计的测试框架,它们都采用.feature文件来描述行为,并使用相似的 Gherkin 语言语法进行描述。它们的.feature文件的格式大致上是相同的,但是在实际的使用和处理上可能会有一些细微差别。

以下是behavepytest-bdd来处理.feature文件的一些细节差异:

  • Scenario 参数化behave使用Scenario Outline语法来实现参数化场景,而pytest-bdd使用Scenarios来实现参数化场景。在behave中,你必须定义 Examples 表格并在其中提供参数值, 而在pytest-bdd中,你可以简单地用Scenarios读取一个外部.feature文件。

  • 装饰器参数:在pytest-bdd中,步骤装饰器(例如@given@when@then)可以接受一个可选的解析器,用于从步骤文本中捕获值。这样,分析器可以为已经定义的步骤参数提供多个场景。

其他大部分方面,behavepytest-bdd都是非常相似的,例如都支持GivenWhenThen这样的基本步骤,都允许在Background段落中定义在每个场景前都要运行的步骤,仍然允许你创建可重用的步骤定义。

综上,behavepytest-bdd处理.feature文件的方式非常相似,虽然在某些特性和实现上有些许差别。选哪个更多取决于个人或团队需求。

pytest-bdd 与 behave的实例比较

接下来以一个具体的加法运算器为实例,初步演示两者使用上的差异。

首先, 两者的规格文件基本相同, 这里的文件名是 :calculator.feature,内容如下:

Feature: AdditionScenario: Add two numbersGiven I have a calculatorWhen I enter "1" and "2"Then the result should be "3"

规格很简单, 就是验证加法, 1+2 =3。

主要的差别是两者在测试代码上的差异。
使用pytest-bdd编写的测试代码的文件名是 test_calculator.py, 内容如下:

import sys
import os
import pytest
#sys.path.append('D:/devworkspace/python-ency/chp3/tests/bdd/util')
sys.path.append(os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), 'util'))
from calculator import Calculator
from pytest_bdd import scenario, given, when, then, parsers@scenario('../features/calculator.feature','Add two numbers')
def test_add():print(sys.path.append(os.path.dirname(os.path.dirname(__file__))+'util'))pass@pytest.fixture
@given("I have a calculator")
def calculator():return Calculator()@when(parsers.parse('I enter "{a}" and "{b}"'))
def enter_numbers(calculator, a, b):calculator.a = int(a)calculator.b = int(b)@then(parsers.parse('the result should be "{result}"'))
def verify_result(calculator, result):assert calculator.add(calculator.a, calculator.b) == int(result)
  • pytest-bdd要求测试场景的函数和名称需要以test_开头, 步骤函数没有特定的要求,关于 pytest-bdd的更多命名的规范可以参考: 基于pytest-bdd的项目目录结构和命名规范

使用behave编写的测试代码的文件名同样是 test_calculator.py, 内容如下:

import sys
import os
sys.path.append(os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(__file__)))), 'util'))from behave import given, when, then
from calculator import Calculator@given('I have a calculator')
def step_impl(context):context.calc = Calculator()@when('I enter "{num1}" and "{num2}"')
def step_impl(context, num1, num2):context.result = context.calc.add(int(num1), int(num2))@then('the result should be "{expected_result}"')
def step_impl(context, expected_result):assert context.result == int(expected_result)

简单对比一下两者的测试代码区别:
在这里插入图片描述

  1. Beave 的写法相比更加简洁
  2. pytest-bdd 可以手动关联测试场景,看上去灵活度更高

总结

这两个框架都有其优点和特性,选择哪一个主要取决于特定需求。

  • 如果你已经在使用pytest,并且希望以最少的学习曲线使用 BDD,那么pytest-bdd可能是更好的选择。
  • 另一方面,如果你希望编写的测试代码更接近自然语言,并且适合非技术团队成员阅读和修改,那么behave可能是更好的选择。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

港口大型设备状态监测及预测性维护策略

在现代港口运营中,大型设备的正常运行对于保障港口作业的高效性至关重要。为了实现设备的可靠性和持续性,港口管理者需要采取一系列状态监测和预测性维护策略。 推进自动化和智能化是提高港口大型设备状态监测和维护管理效率的重要途径。通过应用先进的…

【计算机网络笔记】数据链路层概述

系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能(1)——速率、带宽、延迟 计算机网络性能(2)…

读像火箭科学家一样思考笔记07_探月思维

1. 挑战“不可能”的科学与企业 1.1. 互联网 1.1.1. 和电网一样具有革命性,一旦你插上电源,就能让自己的生活充满活力 1.1.2. 互联网的接入可以帮助人们摆脱贫困,拯救生命 1.1.3. 互联网还可以提供与天气相关的信息 1.2. 用廉价、可靠的…

Windows如何截取屏幕图片以及动态图

在制作PPT或是其他演示文稿或是说明文档的时候, 常常需要截取网页或是屏幕的截图,在Windows中有多种方式可以实现截取屏幕。 Windows 截取屏幕图片的方式 在Windows 中截取屏幕中某个区块的方式有: 方式1. 最原始的方式: 点击 …

C练习题_2

一、单项选择题(本大题共20小题,每小题2分,共40分。在每小题给出的四个备选项中选出一个正确的答案,并将所选项前的字母填写在答题纸的相应位置上。) 以下叙述中错误的是() A.对于double类型数组,不可以直接用数组名对数组进行整…

机器学习与药物筛选的心得体会

机器学习在药物设计里面的应用可以说还是比较常见的,尤其是搞计算的都会或多或少的涉及到这块。比如国内做这块比较多的,浙江大学的侯廷军教授,北京化工大学的闫爱霞教授,华东理工大学的几个做模拟计算的老师,上海药物…

Unity机器学习 ML-Agents第一个例子

上一节我们安装了机器学习mlagents的开发环境,本节我们创建第一个例子,了解什么是机器学习。 我们的例子很简单,就是让机器人自主移动到目标位置,不能移动到地板范围外。 首先我们来简单的了解以下机器学习的过程。 机器学习的过…

分布式锁之基于zookeeper实现分布式锁(三)

3. 基于zookeeper实现分布式锁 实现分布式锁目前有三种流行方案,分别为基于数据库、Redis、Zookeeper的方案。这里主要介绍基于zk怎么实现分布式锁。在实现分布式锁之前,先回顾zookeeper的相关知识点 3.1. 知识点回顾 3.1.1. 安装启动 安装&#xff1a…

『亚马逊云科技产品测评』活动征文|搭建图床chevereto

『亚马逊云科技产品测评』活动征文|搭建图床chevereto 提示:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 Developer Centre, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道 文章目录 『…

Python 获取本地和广域网 IP

Python 获取本地IP ,使用第三方库,比如 netifaces import netifaces as nidef get_ip_address():try:# 获取默认网络接口(通常是 eth0 或 en0)default_interface ni.gateways()[default][ni.AF_INET][1]# 获取指定网络接口的IP地…

字符串相加

题意: 给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。 你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。 示例 1&#xff…

利用STM32CubeMX解读时钟树

1,低速时钟 LSE是外部晶振作时钟源,主要提供给实时时钟模块,所以一般采用32.768KHz。LSI是由内部RC振荡器产生,也主要提供给实时时钟模块,频率大约为40KHz。(LSE和LSI)只是提供给芯片中的RTC(实时时钟)及IWDG(独立看门…

【c++】栈教程

今天来讲讲栈 栈是什么? 老样子,先来看一道题: 【栈】栈的基本操作 描述 栈的定义:栈是一种特殊的表这种表只在表头进行插入和删除操作。因此,表头对于栈来说具有特殊的意义,称为栈顶。相应地&#xff0…

佳易王羽毛球馆计时计费软件灯控系统安装教程

佳易王羽毛球馆计时计费软件灯控系统安装教程 佳易王羽毛球馆计时计费软件,点击开始计时的时候,自动打开灯,结账后自动关闭灯。 因为场馆每一场地的灯功率都很大,需要加装交流接触器。这个由专业电工施工。 1、计时计费功能 &…

docker安装mysql8

之前自己在网上找了一些docker安装mysql8的方法,结果都不行,于是自己根据自己遇到的情况再结合网上搜索到的安装方式调整了一下,成功执行安装。以下是我自己的执行命令 先拉取docekr镜像 docker pull mysql:8.0.20启动镜像 docker run -p 3…

使用Git bash切换Gitee、GitHub多个Git账号

Git是分布式代码管理工具,使用命令行的方式提交commit、revert回滚代码。这里介绍使用Git bash软件来切换Gitee、GitHub账号。     假设在gitee.com上的邮箱是alicefoxmail.com 、用户名为alice;在github上的邮箱是bobfoxmail.com、用户名为bob。 账号…

tcp/ip协议2实现的插图,数据结构2 (19 - 章)

(68) 68 十九1 选路请求与消息 函rtalloc,rtalloc1,rtfree (69)

HarmonyOS ArkTS 保存应用数据(十)

1 概述 在移动互联网蓬勃发展的今天,移动应用给我们生活带来了极大的便利,这些便利的本质在于数据的互联互通。因此在应用的开发中数据存储占据了非常重要的位置,HarmonyOS应用开发也不例外。 2 什么是首选项 首选项为应用提供Key-Value键…

Java面向对象第2天

精华笔记: 构造方法:构造函数、构造器、构建器---------------复用给成员变量赋初始值代码 作用:给成员变量赋初始值 与类同名,没有返回值类型(连void都没有) 在创建(new)对象时被自动调用 若自己不写构造方法,则编…

Electron+VUE3开发简版的编辑器【文件预览】

简版编辑器的功能主要是: 打开对话框,选择文件后台读取文件文件前端展示文件内容。主要技术栈是VUE3、Electron和Nodejs,VUE3做页面交互,Electron提供一个可执行Nodejs的环境以及支撑整个应用的环境,nodeJS负责读取文件内容。 环境配置、安装依赖这些步骤就不再叙述了。 …