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.hqwc.cn/news/212926.html

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

相关文章

基于springboot实现实习管理系统的设计与实现项目【项目源码+论文说明】计算机毕业设计

基于sprinmgboot实现实习管理系统的设计与实现演示 摘要 随着信息化时代的到来,管理系统都趋向于智能化、系统化,实习管理也不例外,但目前国内仍都使用人工管理,市场规模越来越大,同时信息量也越来越庞大,…

常见树种(贵州省):012茶、花椒、八角、肉桂、杜仲、厚朴、枸杞、忍冬

摘要:本专栏树种介绍图片来源于PPBC中国植物图像库(下附网址),本文整理仅做交流学习使用,同时便于查找,如有侵权请联系删除。 图片网址:PPBC中国植物图像库——最大的植物分类图片库 一、茶 灌…

Banana Pi [BPi-R3-Mini] 回顾和主线 ImmortalWrt 固件支持

BananaPi BPi-R3 Mini 采用 MediaTek 830(4 个 A53,最高 2.0 GHz),具有 2 个 2.5 GbE、AX4200 2.4G/5G 无线和 USB 2.0 端口。它还具有两个 M.2 连接器,可用于 NVMe SSD 和 5G 模块(板上包含 Nano SIM 插槽…

springboot 外部化配置

背景:修改jar包中的配置比较麻烦 项目部署的时候放一个配置文件在jar包外 配置文件优先级: 1.jar包内的application.properties/yaml 2.jar包内的application-{profile}.properties/yaml 3.jar包外的application.properties/yaml 4.jar包外的application-{profile}.properties…

手撕A*算法(详解A*算法)

A*算法原理 全局路径规划算法,根据给定的起点和终点在全局地图上进行总体路径规划。 导航中使用A*算法计算出机器人到目标位置的最优路线,一般作为规划的参考路线 // 定义地图上的点 struct Point {int x,y; // 栅格行列Point(int x, int y):x(x),y(y){…

STM32_6(TIM)

TIM定时器(第一部分) TIM(Timer)定时器定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时不仅…

导数、方向导数、梯度方向、梯度

导数:自变量改变一定量时(大于或小于0),因变量改变多少 方向导数:限定在某一个方向上,自变量改变一定量时(大于0),因变量改变多少 梯度方向:方向导数最大的…

[Linux] shell脚本的函数和数组

一、函数 1.1 函数的定义 函数是脚本的别名 作用:函数可以避免代码重复,可读性强,可以简化脚本。 格式:函数名(){脚本} 1.2 如何使用函数 1.定义 2.调用 函数一定要先定义再使用 例子&#xff1a…

SpringBoot 实现CAS Server统一登录认证

SpringBoot 集成CAS Server 一、CAS Service服务介绍 ​ CAS(Central Authentication Service)中心授权服务,是一个开源项目,目的在于为Web应用系统提供一种可靠的单点登录。 ​ 在整个认证的流程中的整个流程大概是&#xff1…

VRRP协议基础配置实验(H3C模拟器)

嘿,这里是目录! ⭐ H3C模拟器资源链接1. 实验示意图2. 要求3. 当前配置3.1 PC1、PC2配置3.2 SW配置3.2.1 SW1配置3.2.2 SW2配置 4. 查看相关配置 ⭐ H3C模拟器资源链接 H3C网络设备模拟器官方免费下载 1. 实验示意图 2. 要求 SW1,SW2之间运…

U盘启动制作工具Rufus

U盘启动制作工具Rufus 下载U盘启动制作工具Rufus,进入Rufus官网:http://rufus.ie/en/,打开之后往后滑动,找到download即可点击下载。 需要插入U盘 首先需要插入U盘,如果U盘有重要文件一定要备份,然后右键…

用于计算机屏幕安全摄像头系统:Screen Anytime Crack

Screen Anytime 是一款软件,旨在自动将整个用户会话或 PC/服务器/VM/Kiosk 的 /RDP/Citrix/RemoteApp 会话的屏幕活动记录到视频日志文件中,以用于记录、审核和监控目的。通过重播其高度压缩的视频,您可以轻松回顾单台计算机或一组服务器/PC …