TDD、BDD、ATDD以及SBE的概念和区别

在软件开发或是软件测试中会遇到以下这些词:TDD 、BDD 、ATDD以及SBE,这些词代表什么意思呢? 它们之间有什么关系吗?

TDD 、BDD 、ATDD以及SBE的基本概念

TDD:(Test Driven Development)是一种软件开发方法,它强调在编写代码之前先编写测试。TDD 的主要思想是先编写一个测试用例,然后编写能够通过该测试用例的最小代码实现,接着运行测试用例并查看是否能够通过,最后重构代码以增强代码质量。这种方法可以帮助开发人员更快地发现和解决问题,并提高代码的可维护性、可重用性和可靠性。

ATDD:代表Acceptance Test Driven Development,它是一种敏捷软件开发方法。它的核心思想是在开发过程中首先关注用户需求和期望,然后根据这些需求编写自动化的验收测试用例。开发人员与客户和业务用户密切合作,确保开发的功能符合期望并满足用户需求。ATDD 可以帮助团队更好地理解问题,并确保开发人员和业务利益相关者在开发过程中保持相关,减少沟通障碍,并提高软件质量和生产率。

BDD:表示行为驱动开发(Behavior-Driven Development),是一种敏捷软件开发方法,强调开发团队应该以用户行为为核心来开发软件,而不是只关注功能。BDD强调通过明确定义的场景和用户故事来推动软件开发,帮助团队更好地理解和满足用户需求,同时加强开发团队内部的协作和沟通。在BDD中,开发人员、测试人员和业务人员之间的交流是非常重要的,他们需要共同制定和理解用户故事和场景,并将它们转化为可执行的测试用例。这种方法可以促进软件质量的提高和快速交付。

SBE: Specification by Example是一种敏捷方法,旨在通过创建具体示例来建立软件开发所需的共同理解。它强调通过业务规则和用户需求的实际示例来描述软件的功能和行为。这种方法提倡开发团队和利益相关者之间的协作和交流,并有助于确保整个团队对要交付的软件具有共同的理解。Specification by Example强调了功能测试驱动的开发方法,并支持自动化测试的实现。

从概念上看, 这四个词都是一种软件开发方法, 都属于敏捷开发方法。TDD这个相对还比较好理解,简单点说,就是先写测试,再去开发,那么另外三个的区别又是什么呢?

TDD 、BDD 、ATDD以及SBE的由来

  • TDD最早是由Kent Beck在2002年提出的,他在一篇名为《Test Driven Development: By Example》的书中详细阐述了这种开发方法的原理和实践。TDD的出现是为了解决传统的软件开发中测试工作落后于开发工作的问题,以及开发人员和测试人员之间没有足够的沟通和协作的问题。TDD强调了开发人员编写自动化测试用例的重要性,这使得测试工作可以更早地开始,并且帮助开发人员更好地理解业务需求,编写更贴近实际需求的代码。

  • ATDD最早是由Kent Beck和Cynthia Andres在《Extreme Programming Explained》一书中提出的,其目的是让开发人员与业务人员密切合作,确保开发出的软件满足业务需求。ATDD的核心是编写验收测试用例,这些测试用例描述了业务需求,并且必须由业务人员审查和接受。

  • BDD则是由Dan North在其博客上首次提出的,他认为传统的TDD缺乏对系统行为和设计的明确定义。BDD的核心是使用自然语言来描述系统的行为,并将其转化为可以执行的测试用例。BDD强调使用文本描述来定义测试用例,使得开发人员和业务人员都能理解测试用例的意义,从而更好地确保开发出的软件满足业务需求。

  • SBE,Specification by Example 则是由Gojko Adzic在著作Specification By Example(实例化需求)详细阐述,介绍了如何通过实例去分析和沟通需求。
    在这里插入图片描述

这四者出现的时间顺序依次是: TDD > ATDD > BDD > SBE

TDD 、BDD 、ATDD以及SBE 的区别和联系

  1. TDD与ATDD

TDD是测试驱动开发,ATDD是验收测试驱动开发,都是关于测试的,是与所开发的系统紧密联系的。但TDD是开发人员和测试人员之间的沟通,而ATDD则主要是开发人员和业务人员之间的沟通。

  1. TDD与BDD
    BDD不是关于测试的,其着重关注需求、关注客户的业务价值,所描述的需求用例是可以独立于软件系统存在的,因为客户的业务是始终存在的,不取决于是否有软件系统来支撑。
    对比一下TDD 和 BDD 的主要区别:
TDD (测试驱动开发)BDD (行为驱动开发)
1. TDD 是一种迭代的开发方法,开发者首先编写测试,然后产生代码,使这个测试运行通过。1. 在 BDD 中,开发者,测试人员和业务人员一起确定可受验收的测试标准,然后编写样例,最后由开发者编写代码让样例通过。
2. TDD 主要关注软件的技术功能。 是有关于单元测试的。2. BDD 更关注软件的业务和行为,关注的不仅仅是代码的功能,更多是用户体验。通常在验收测试和功能测试时会使用 BDD。
3. TDD 是通过编写测试来驱动开发过程,这种写法对于程序员来说更容易理解。3. BDD 是使用自然语言和具有描述性的句子来编写的测试。这为非技术人员理解何时以及如何测试提供了便利。
4. 在 TDD 中,开发者首先需要编写失败的单元测试,然后编写代码使测试通过。4. 在 BDD 中,从一开始就需要定义预期的行为。这种行为是为了确定在给定的情况下应用程序应做什么。

这两种开发方法并非相互排斥,而是可以结合使用的。许多团队都会在项目中同时实施 TDD 和 BDD。

  1. ATDD与BDD
    ATDD(Acceptance Test Driven Development)和BDD(Behavior Driven Development)都是敏捷开发方法中的测试驱动开发(TDD)实践的变体。它们的出现是为了解决传统的软件开发中开发人员和业务人员之间缺乏通信的问题,这往往导致开发出来的软件无法满足业务需求。
    因此,虽然ATDD和BDD在一定程度上有所不同,但它们的目的是相同的:确保开发出的软件能够满足业务需求。同时它们也有一些共同点,例如都强调了测试驱动开发的核心思想,都强调了开发人员和业务人员之间的紧密合作等。

  2. BDD与SBE
    SBE(Specification By Example,实例化需求)是在BDD之后由Gojko提出来的,也是关于需求的,主要强调通过列举实例发现需求中的缺失概念。BDD也是关注需求的,同样会使用实例来描述行为。两者的本质没有区别。

对比一下 TDD , ATDD , BDD 三者的区别:

区别项次TDDATDDBDD
参与者开发人员,测试人员业务人员,开发人员,测试人员ATDD和TDD的组合
重点一种模式或范例是客户进入设计阶段专注客户和开发者的系统行为方面,引导客户进入测试阶段
敏捷步骤不断重复:1.测试2.编码3.重构不断重复:1.讨论 2.开发 3. 发布按预期行为逐步构建功能
输入文档需求文档验收标准+示例GWT格式书写的实例化文档
自动化必须非必须必须
故事每个功能都需要对应一个测试每个故事对应一个验收测试每个故事对应一个行为测试
主流工具xUnit.RobotFramework, .FitNesseCucumber,JBehave,Lettuce,Robt Framework
最终用户开发人员,测试人员客户客户和开发者

最简单的理解

到这里是不是感觉上面的内容很多,看着看着还是有点迷惑,接下来笔者尝试以最简单的方式来解释一下这四个概念:
TDD , ATDD , BDD ,SBE 这四者基本都属于软件开发方法或者实践,一个方法的出现基本是为了解决面对的问题,
软件开发方法也是为了解决软件开发过程中出现的问题:

  • 从软件的洪荒时代开始,开发软件最重要的是保障软件的质量,不能开发运行一个错误的软件, 比如一个计算器软件算出来1+1=3;也不能开发一个软件运行着就崩溃了, 于是软件需要有充分的测试,也就有了TDD
  • 把事情做对不一定代表是对的事情,软件的运行可能不会出错,但是这不代表这个软件就是客户需要的软件,客户要求开发一个计算器,但是你却开发了一个计时器,让客户很早的进入设计阶段,关注客户的需求,根据需求编写验收测试用例,也就是ATDD
  • 引导客户参与,但是开发人员和客户之间因为领域知识不同,导致沟通存在一些鸿沟,往往鸡同鸭讲,彼此不能很好的理解,于是是不是有一种通用的语言让开发人员和客户都能很好的理解,对于开发人员来说, 使用这种语言的话也就不仅仅关注的是代码层面的内容,而且可以更好的理解用户的行为, 也就是行为驱动开发-BDD
  • 在使用通用领域语言描述规格的时候,通用领域语言其实也就是接近自然语言的一种方式, 但是自然语言描述可能会存在歧义,于是把一些冗余或是容易产生误解的描述使用示例的方式进行描述不就更准确了吗?比如描述个人的信息,XX的姓名是XX, 年龄是多少,如果换成示例的模式, 使用一个表格 :
    | 姓名 | 年龄 | xx |
    | — | — |— |
    | oscar | 30 | xx |
    这也就是SBE的大概思想。


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

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

相关文章

Git 入门使用

一、Git 入门 1.1 Git简介 Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。Git是由Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。 Git是目前世界上最先进的分布式版本控制系统,没有之一&a…

行情分析——加密货币市场大盘走势(11.10)

大饼今日继续上涨,正如预期,跌不下来,思路就是逢低做多。现在已经上涨到36500附近,目前从MACD日线来看,后续还要继续上涨,当然稳健的可以不做。昨日的策略已经达到止盈,也是顺利的落袋为安啦。一…

黑洞路由的几种应用场景

第一种在内网中产生环路: 这种核心交换机上肯定写一条默认路由 0.0.0.0 0 10.0.0.1 出口路由要写一条192.168.0.0 16 10.0.0.2 如果出口路由访问一条不存在的内网网段,又或者访问的那台终端停机了,那就会产生三层环路,数据包在…

Sentinel网关限流

背景 在微服务架构下,每个服务的性能都不同,为避免出现流量洪峰将服务冲垮,需要依赖限流工具来保护服务的稳定性。sentinel是阿里提供的限流工具,社区活跃,功能也很全面,包含实时监控、流控、熔断等功能。…

实现智慧工地的高效建筑管理,数据分析起着关键作用!

智慧工地是利用物联网、云计算、大数据等技术,实现对建筑工地实时监测、管理和控制的一种新型建筑管理方式。 智慧工地架构: 1、终端层:充分利用物联网技术、移动应用、智能硬件设备提高现场管控能力。通过RFID、传感器、摄像头、手机等终端…

很多个pdf怎么合并在一起?

很多个pdf怎么合并在一起?作为一个办公室的伙伴,对于PDF格式肯定不会陌生。它强大的功能为我们的工作提供了许多便利。由于PDF文件格式的稳定性和安全性较高,我们通常在工作或学习中使用它来传输文件,很多人都喜欢将办公文件都做成…

NVM安装node后提示没有对应npm包(即:无法将“npm”项识别为 cmdlet、函数、脚本文件)

背景 windows11 node版本降低到v12.22.12后,执行:nvm -v npm -v npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果 包括路径,请确保路径正确,然后再试一次。 所在位置 …

Python 解决tkinter的Menu菜单command参数与bind方法共用触发事件

用普通函数作为媒介,使用event_generate()方法模拟触发bind()事件来创建一个模拟的event对象,并将其传递给绑定的事件处理函数。 运行结果 示例代码 import tkinter as tk# 菜单事件 def menuEvent(event):print(event.x, event.y)label.config(textf鼠…

OC-编译错误

明明包含了头文件,但是还是显示未知的类型 可能这个头文件被某个宏包住了 #if defined(__cplusplus) 在 C 代码中包含了一个 C 的头文件会显示这个错误“the util lib only be used in c”,此时用 #if defined(__cplusplus) #endif 包一下就行了&…

IntelliJ IDEA 2023.2.1 (Ultimate Edition) 版本 Git 如何合并多次的本地提交进行 Push

本心、输入输出、结果 文章目录 IntelliJ IDEA 2023.2.1 (Ultimate Edition) 版本 Git 如何合并多次的本地提交进行 Push前言为什么需要把多次本地提交合并合并提交的 2 种形式:事中合并、事后合并事中合并事后合并:支持拆分为多组提交弘扬爱国精神IntelliJ IDEA 2023.2.1 (U…

Android Mvp案例解析

目录 后端数据接口数据格式 App客户端布局逻辑主界面布局 M(Model)V(View)P(Presenter)OkhttpRetrofitRxJava网络http请求 Mvp架构-初学者MVP架构的契约者 后端数据接口 接口地址:https://apis.…

flink1.18.0 自适应调度器 资源弹性缩放 flink帮你决定并行度

jobmanager.scheduler Elastic Scaling | Apache Flink 配置文件修改并重启flink后,webui上会显示调整并行度的按钮,他可以自己调整,你也可以通过webUI手动调整: 点击 之后: 调整完成后:

机器学习——朴素贝叶斯

目录 一、贝叶斯方法 背景知识 贝叶斯公式 二、朴素贝叶斯原理 判别模型和生成模型 1.朴素贝叶斯法是典型的生成学习方法 2.朴素贝叶斯法的基本假设是条件独立性 3.朴素贝叶斯法利用贝叶斯定理与学到的联合概率模型进行分类预测 用于文…

FindMy网络帮助您找到电动车

随着科技的发展,我们的生活变得越来越智能化。而现在,这项技术已经深入到了我们的出行方式中。如果你是一位电动车主,那么你可能会遇到一个常见的问题:忘记你的电动车停在了哪里。这种情况在日常生活中时有发生,而现在…

Python - 利用 OCR 技术提取视频台词、字幕

目录 一.引言 二.视频处理 1.视频样式 2.视频截取 ◆ 裁切降帧 ◆ 处理效果 3.视频分段 三.OCR 处理 1.视频帧处理 2.文本识别结果 3.后续工作与优化 ◆ 识别去重 ◆ 多线程提效 ◆ 片头片尾优化 四.总结 一.引言 视频经常会配套对应的台词或者字幕&#xff0c…

CSS时间线样式

css实现时间线样式,效果如下图: 一、CSS代码 .timeline {padding-left: 5px} .timeline-item { position: relative;padding-bottom: 20px;} .timeline-axis {position: absolute;left: -5px;top: 0;z-index: 10;width: 20px;height: 20px;line-he…

火爆全网!用 Pyecharts 就能做出来“迁徙图“和“轮播图“

1.pyecharts知识点回顾 1)知识回顾 前面我们已经讲述了,如何使用pyecharts进行图形的绘制,一共涉及到如下四步。我们今天就是按照下面这几步来进行迁徙图和轮播图的绘制。 ① 选择图表类型; ② 声明图形类并添加数据&#xff1…

uni-app基于vite和vue3创建并集成pinia实现数据持久化

一、uni-app基于Vite和Vue3创建并集成pinia实现数据持久化 文章目录 一、uni-app基于Vite和Vue3创建并集成pinia实现数据持久化1.如何创建基于Vite和Vue3的uni-app项目?2.选择其中一个分支,就是一个脚手架 二、以下都是基于vite-ts版本创建和配置1.目录结…

用友NC Cloud accept.jsp接口任意文件上传漏洞复现 [附POC]

文章目录 用友NC Cloud accept.jsp接口任意文件上传漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 用友NC Cloud accept.jsp接口任意文件上传漏洞复现 [附POC] 0x01 前言 免责声明&#xff1a…

Redis客户端-引入jedis

ssh端口转发 Redis服务器在官网公开了使用的协议(RESP),此时任何一个第三方都可以通过上述协议,来实现出一个和redis服务器通信的客户端程序. 现在,已经有很多库可以让我们直接调用,就不必关注redis协议的细节了. 在java的生态中,封装了RESP协议,实现的redis客户端有很多,我…