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

news2024/11/13 14:58:39

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: Addition
  Scenario: Add two numbers
    Given I have a calculator
    When 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.coloradmin.cn/o/1245376.html

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

相关文章

美团技术博客即将十周岁啦 | 欢迎分享你跟它的故事

种一棵树最好的时间是十年前,其次是现在。 2013年12月04日, 美团技术博客发布了第一篇技术文章。 时光荏苒,岁月如歌。 美团技术博客即将迎来自己十周岁的生日。 感谢大家的一路相伴。 十年来,美团技术博客累计发布了570多篇技术文…

STM32_6(TIM)

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

【深度学习】神经网络术语:Epoch、Batch Size和迭代

batchsize:中文翻译为批大小(批尺寸)。 简单点说,批量大小将决定我们一次训练的样本数目。 batch_size将影响到模型的优化程度和速度。 为什么需要有 Batch_Size : batchsize 的正确选择是为了在内存效率和内存容量之间寻找最…

WordPress站点屏蔽过滤垃圾评论教程(Akismet反垃圾评论插件)

前段时间我的WordPress站点经常收到垃圾评论的轰炸,严重时一天会收到几十条垃圾评论。我这个小破站一没啥流量,二又不盈利,实在是不太理解为啥有人要这么执着地浪费资源在上面。 Akismet反垃圾评论插件 其实用了 Akismet 反垃圾评论插件后&a…

java--static修饰成员变量

1.static 叫静态,可以修饰成员变量、成员方法。 2.成员变量按照有无static修饰,分为两种: ①类变量:有static修饰,属于类,在计算机里只有一份,会被类的全部对象共享(不管那个类调用的&#x…

Spring Security(安全框架,必须登录成功才能访问指定资源)

一、背景知识 1、Spring Security 是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(IOC: 控制反转Inversion of Control ,DI:D…

97、Text2NeRF: Text-Driven 3D Scene Generation with Neural Radiance Fields

简介 论文地址 使用扩散模型来推断文本相关图像作为内容先验,并使用单目深度估计方法来提供几何先验,并引入了一种渐进的场景绘制和更新策略,保证不同视图之间纹理和几何的一致性 实现流程 简单而言: 文本-图片扩散模型生成一…

在PCL视图器中使用随机生成的颜色来可视化一组匹配的点对

std::vector<Eigen::Vector2d> centroids_unknown_motion_underk; std::vector<Eigen::Vector2d> centroids_unknown_motion_k; // 进行数字填充 pcl::visualization::PCLVisualizer viewer("Centroid Visualization");int id 0;// 添加 XY 坐标系doub…

Okhttp 浅析

安全的连接 OkHttpClient: OkHttpClient: 1.线程调度 2.连接池,有则复用,没有就创建 3.interceptor 4.interceptor 5.监听工厂 6.是否失败重试 7.自动修正访问,如果没有权限或认证 8是否重定向 followRedirects 9.协议切换时候是否继续重定向 10.Cookie jar 容器 默认…

软件开发及交付中,如何平衡项目进度和团队成员的利益?

在平衡软件质量与时间、成本、范围的关系时&#xff0c;需要考虑到项目管理的金三角概念&#xff0c;即时间、成本和范围。从项目管理的角度来看&#xff0c;项目进度和团队成员的利益需要平衡。 以下是一些建议&#xff1a; 制定可行的计划&#xff1a;让项目相关各方充分参与…

Java面试-框架篇-Mybatis

Java面试-框架篇-Mybatis MyBatis执行流程延迟加载使用及原理一, 二级缓存来源 MyBatis执行流程 读取MyBatis配置文件: mybatis-config.xml加载运行环境和映射文件构造会话工厂SqlSessionFactory会话工厂创建SqlSession对象(包含了执行SQL语句的所有方法)操作数据库的接口, Ex…

Retrofit 原理浅析 二

类型安全的连接 enqueue : 异步 切线程,会在队列中执行 execute : 同步 不切线程 Retrofit:Create 1.验证是否是接口 否则是类或者其他则报错 API Declarations must be interfaces 2.check . add 取出进行处理,然后添加到Colltions 中,如果有父接口则报错,不能是泛型 添加…

【uniapp】部分图标点击事件无反应

比如&#xff1a;点击这个图标在h5都正常&#xff0c;在小程序上无反应 css&#xff1a;也设置z-index&#xff0c;padding 页面上也试过click.native.stop.prevent"changePassword()" 时而可以时而不行&#xff0c; 最后发现是手机里输入键盘的原因&#xff0c;输…

pcie-2-rj45速度优化

背景: 目前用iperf3打流传输速率达不到要求,千兆实际要求跑到800M以上: 优化方案: 1.优化defconfig: 首先编译user版本验证看是否正常 debug版本关闭CONFIG_SLUB_DEBUG_ON宏控。 2.找FAE ,通过更换驱动,或者更新驱动来优化 3.绑定大核: 以8125网卡为例,udp…

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

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

开启数据库审计(db,extended级别或os级别),并将审计文件存放到/home/oracle/audit下

文章目录 开启数据库审计&#xff08;db,extended级别或os级别&#xff09;&#xff0c;并将审计文件存放到/home/oracle/audit下一. 简介二. 配置2.1. 审计是否安装2.2. 审计表空间迁移2.3. 审计参数2.4. 审计级别2.5. 其他审计选项2.6. 审计相关视图 三. 使用3.1. 开启/关闭审…

【已解决】微信小程序腾讯地图的map清除markers,setData将marker置空后,安卓和ios还会显示上次的内容的问题所在以及解决办法

问题描述 1.我首先点击了这个marker 2.这里可以看到根据id获取到了他的信息 3.当我滑动了地图&#xff0c;这时候重新加载了markers&#xff0c;我再次点击这个marker 4.会发现获取不到数据了 问题原因 个人猜测引起这个问题的原因是id重叠了&#xff0c;导致获取不到数据&am…

【shell】函数和数组的原理及使用注意

目录 一、函数 1.1函数的优点&#xff1a; 1.2如何定义函数&#xff08;shell&#xff09; 1.3 演示函数的作用以及增删改查 关于函数的使用 关于declare查询的用法 关于函数的增加与调用 关于函数的返回值return 关于echo作为返回 关于函数的参数传递 关于函数的环…

前端编码技巧须知

前端开发中可能会使用到以下软件&#xff0c;它们各自具有不同的作用&#xff1a; 代码编辑器&#xff1a;例如Sublime Text、Atom、Visual Studio Code等&#xff0c;用于编写和编辑HTML、CSS和JavaScript等前端代码。网页浏览器&#xff1a;例如Chrome、Firefox、Safari等&a…

【C++】C++入门(下)——有C语言基础的C++学习

C入门&#xff08;下&#xff09; 一、引用1.引用的概念2.引用的定义3.引用特性4.常引用5.使用场景做参数做返回值 6.引用的作用7.引用与指针的区别 二、内联函数1.概念2.特性 三、auto关键字&#xff08;C11&#xff09;1.简介2.auto的使用细则auto与指针和引用结合起来使用在…