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 的区别和联系
- TDD与ATDD
TDD是测试驱动开发,ATDD是验收测试驱动开发,都是关于测试的,是与所开发的系统紧密联系的。但TDD是开发人员和测试人员之间的沟通,而ATDD则主要是开发人员和业务人员之间的沟通。
- 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。
-
ATDD与BDD
ATDD(Acceptance Test Driven Development)和BDD(Behavior Driven Development)都是敏捷开发方法中的测试驱动开发(TDD)实践的变体。它们的出现是为了解决传统的软件开发中开发人员和业务人员之间缺乏通信的问题,这往往导致开发出来的软件无法满足业务需求。
因此,虽然ATDD和BDD在一定程度上有所不同,但它们的目的是相同的:确保开发出的软件能够满足业务需求。同时它们也有一些共同点,例如都强调了测试驱动开发的核心思想,都强调了开发人员和业务人员之间的紧密合作等。 -
BDD与SBE
SBE(Specification By Example,实例化需求)是在BDD之后由Gojko提出来的,也是关于需求的,主要强调通过列举实例发现需求中的缺失概念。BDD也是关注需求的,同样会使用实例来描述行为。两者的本质没有区别。
对比一下 TDD , ATDD , BDD 三者的区别:
| 区别项次 | TDD | ATDD | BDD |
|---|---|---|---|
| 参与者 | 开发人员,测试人员 | 业务人员,开发人员,测试人员 | ATDD和TDD的组合 |
| 重点 | 一种模式或范例 | 是客户进入设计阶段 | 专注客户和开发者的系统行为方面,引导客户进入测试阶段 |
| 敏捷步骤 | 不断重复:1.测试2.编码3.重构 | 不断重复:1.讨论 2.开发 3. 发布 | 按预期行为逐步构建功能 |
| 输入文档 | 需求文档 | 验收标准+示例 | GWT格式书写的实例化文档 |
| 自动化 | 必须 | 非必须 | 必须 |
| 故事 | 每个功能都需要对应一个测试 | 每个故事对应一个验收测试 | 每个故事对应一个行为测试 |
| 主流工具 | xUnit | .RobotFramework, .FitNesse | Cucumber,JBehave,Lettuce,Robt Framework |
| 最终用户 | 开发人员,测试人员 | 客户 | 客户和开发者 |
最简单的理解
到这里是不是感觉上面的内容很多,看着看着还是有点迷惑,接下来笔者尝试以最简单的方式来解释一下这四个概念:
TDD , ATDD , BDD ,SBE 这四者基本都属于软件开发方法或者实践,一个方法的出现基本是为了解决面对的问题,
软件开发方法也是为了解决软件开发过程中出现的问题:
- 从软件的洪荒时代开始,开发软件最重要的是保障软件的质量,不能开发运行一个错误的软件, 比如一个计算器软件算出来1+1=3;也不能开发一个软件运行着就崩溃了, 于是软件需要有充分的测试,也就有了TDD
- 把事情做对不一定代表是对的事情,软件的运行可能不会出错,但是这不代表这个软件就是客户需要的软件,客户要求开发一个计算器,但是你却开发了一个计时器,让客户很早的进入设计阶段,关注客户的需求,根据需求编写验收测试用例,也就是ATDD
- 引导客户参与,但是开发人员和客户之间因为领域知识不同,导致沟通存在一些鸿沟,往往鸡同鸭讲,彼此不能很好的理解,于是是不是有一种通用的语言让开发人员和客户都能很好的理解,对于开发人员来说, 使用这种语言的话也就不仅仅关注的是代码层面的内容,而且可以更好的理解用户的行为, 也就是行为驱动开发-BDD
- 在使用通用领域语言描述规格的时候,通用领域语言其实也就是接近自然语言的一种方式, 但是自然语言描述可能会存在歧义,于是把一些冗余或是容易产生误解的描述使用示例的方式进行描述不就更准确了吗?比如描述个人的信息,XX的姓名是XX, 年龄是多少,如果换成示例的模式, 使用一个表格 :
| 姓名 | 年龄 | xx |
| — | — |— |
| oscar | 30 | xx |
这也就是SBE的大概思想。
相关文章:
TDD、BDD、ATDD以及SBE的概念和区别
在软件开发或是软件测试中会遇到以下这些词:TDD 、BDD 、ATDD以及SBE,这些词代表什么意思呢? 它们之间有什么关系吗? TDD 、BDD 、ATDD以及SBE的基本概念 TDD:(Test Driven Development)是一种…...
Android studio:打开应用程序闪退的问题
目录 问题描述分析原因解决方法 在开发Android应用程序的过程中遇到的问题 问题描述 在开发(或者叫测试,这么简单的程序可能很难叫开发)好一个android之后,在Android studio中调试开发好的app时,编辑器没有提示错误&a…...
Mysql数据库性能优化--performance_SCHEMA.STATEMENTS语句分析
使用performance_schema解决常见的故障案例 1 检查sql语句 使用performance_schema很容易找到引起性能问题的查询以及原因。 要启动语句检测,需要启动statement类型的插装。 插装类: statement/sql sql语句,如select,或者create table。s…...
[C/C++]数据结构 链表OJ题: 反转链表
描述: 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表 示例: 方法一: 让链表指向反向 如图所示: 代码思路: struct ListNode* reverseList(struct ListNode* head) {struct ListNode* n1NULL;struct ListNode* n2head;struct ListNode*…...
深度学习之基于YoloV5交通信号标志识别系统
欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 基于YoloV5交通信号标志识别系统介绍 基于YoloV5的交通信号标志识别系统是一种深度学习应用,旨在通过使…...
Linux命令大全
荒诞也好,愚笨也好,总会过去的 文章目录 文件相关压缩相关tarzip 进程相关pskill 网络相关netstat IPC相关ipcsipcrm 系统资源相关topfreefdiskdfdu 权限相关umaskchmodchownchgrp 总结 文件相关 ls:列出当前目录中的文件和子目录。 ls常用…...
元宇宙是否为噱头?若不是,什么是元宇宙?他的概念、技术、应用和影响是什么?
文章来源:元宇宙的概念、技术、应用与影响——一项系统性文献综述 - 中国知网 (cnki.net) 摘要 [目的/意义]系统综述与分析当前国内外的元宇宙研究现状,有利于准确把握元宇宙发展方向,强化元宇宙基础研究,争取元宇宙建构权。[方法…...
293_C++_告警类
2、IncPos S32 AlarmList::IncPos(U32 *pu32Pos, U32 *pu32Cycle) {if((pu32Pos == NULL) || (pu32Cycle == NULL))</...
MySQL基础操作
注:mysql是大小写不敏感的. 1.数据库基础操作(展示) //1.展示当前数据库 show databases;//2.创建数据库 create database 数据库名;//3.使用数据库 use 数据库名;//4.删除数据库 drop database 数据库名;2.SQL中基本类型 2.1 数值类型(整数和浮点型) 注:decimal和numeric…...
ajax样式演示
以下是一段Ajax的演示代码,实现了通过Ajax获取后台数据并将其显示到前台页面上。 HTML文件: <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>Ajax演示</title></head><body><h1>学生…...
Web前端—CSS高级(定位、高级技巧、CSS修饰属性、综合案例:购物网站轮播图)
版本说明 当前版本号[20231108]。 版本修改说明20231107初版20231108对知识点(圆点)进行补充 目录 文章目录 版本说明目录day08-CSS高级01-定位相对定位绝对定位定位居中固定定位堆叠层级 z-index定位总结 02-高级技巧CSS精灵案例-京东服务HTML结构CS…...
linux的sftp复制传输文件
连接远程服务器 sftp -P 端口号 用户名主机 例如:sftp -P 80 ubuntu172.168.0.1 并按照提示输入密码 分别使用命令查看本地当前路径(Local) 和远程路径(Remote) pwd lpwd 使用 cd 远程路径和 lcd 本地路径分别进入对…...
【星海出品】flask(一)demo
如何安装很早就讲过了,这里就省略了 创建虚拟环境 python -m venv ./venv 激活虚拟环境 source venv/Scripts/activate 退出虚拟环境 deactivate 打开一个vue项目,安装一些东西,然后启动 npm run serve npm install element-plus --save npm…...
从vue源码中看diff算法
一、v-for必须要指定key,其作用是什么? 在源码中有一个函数为,其中就是通过判断两个vnode的type和key进行判断,如果这两个属性相同,那么这两个vnode就是相同,所以在设置key的时候也不可以设置为object等无…...
【17】c++11新特性 —>弱引用智能指针weak_ptr(2)
返回管理this的shared_ptr 通过wek_ptr返回管理this资源的共享智能指针对象shared_ptr。C11中为我们提供了一个模板类叫做std::enable_shared_from_this,这个类中有一个方法叫做shared_from_this(),通过这个方法可以返回一个共享智能指针,在…...
如何去除视频水印?三种简便有效的方法解决视频水印问题
在当今社交媒体时代,视频分享已成为一种流行趋势。然而,很多人在分享自己的作品时却苦于视频上存在的水印,水印通常是出于版权保护或品牌推广的目的而添加到视频中的,但有时它们可能会对用户体验造成负面影响。 如果您正在寻找如何…...
快速构建高质量中文APP登录注册页面Figma源文件
在这个数字化时代,移动应用程序(APP)已经成为我们日常生活中不可或缺的一部分。如果您正在为您的中文APP开发登录注册页面,并寻找高质量的UI设计素材,那么您来对地方了!我们为您提供了一个完整的Figma源文件…...
MySQL库的库操作指南
1.创建数据库 一般格式:create database (if not exists) database1_name,database2_name...... 特殊形式: create database charset harset_name collate collate_name 解释: 红色字是用户自己设置的名称charset:指定数据…...
【单目测距】单目相机测距(三)
文章目录 一、前言二、测距代码2.1、地面有坡度2.2、python代码2.2.1、旋转矩阵转角度2.2.2、角度转旋转矩阵2.2.3、三维旋转原理 (Rotation 原理)2.2.4、完整代码 2.3、c 代码 一、前言 上篇博客【单目测距】单目相机测距(二) 有讲到当相机不是理想状态…...
Evaluating Large Language Models: A Comprehensive Survey
本文是LLM系列文章,针对《Evaluating Large Language Models: A Comprehensive Survey》的翻译。 评估大型语言模型:一项综合调查 摘要1 引言2 分类和路线图3 知识和能力评估4 对齐评估5 安全评估6 专业LLM评估7 评估组织8 未来方向9 结论 摘要 大型语…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
