当前位置: 首页 > news >正文

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的大概思想。


相关文章:

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的演示代码&#xff0c;实现了通过Ajax获取后台数据并将其显示到前台页面上。 HTML文件: <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>Ajax演示</title></head><body><h1>学生…...

Web前端—CSS高级(定位、高级技巧、CSS修饰属性、综合案例:购物网站轮播图)

版本说明 当前版本号[20231108]。 版本修改说明20231107初版20231108对知识点&#xff08;圆点&#xff09;进行补充 目录 文章目录 版本说明目录day08-CSS高级01-定位相对定位绝对定位定位居中固定定位堆叠层级 z-index定位总结 02-高级技巧CSS精灵案例-京东服务HTML结构CS…...

linux的sftp复制传输文件

连接远程服务器 sftp -P 端口号 用户名主机 例如&#xff1a;sftp -P 80 ubuntu172.168.0.1 并按照提示输入密码 分别使用命令查看本地当前路径&#xff08;Local&#xff09; 和远程路径&#xff08;Remote&#xff09; pwd lpwd 使用 cd 远程路径和 lcd 本地路径分别进入对…...

【星海出品】flask(一)demo

如何安装很早就讲过了&#xff0c;这里就省略了 创建虚拟环境 python -m venv ./venv 激活虚拟环境 source venv/Scripts/activate 退出虚拟环境 deactivate 打开一个vue项目&#xff0c;安装一些东西&#xff0c;然后启动 npm run serve npm install element-plus --save npm…...

从vue源码中看diff算法

一、v-for必须要指定key&#xff0c;其作用是什么&#xff1f; 在源码中有一个函数为&#xff0c;其中就是通过判断两个vnode的type和key进行判断&#xff0c;如果这两个属性相同&#xff0c;那么这两个vnode就是相同&#xff0c;所以在设置key的时候也不可以设置为object等无…...

【17】c++11新特性 —>弱引用智能指针weak_ptr(2)

返回管理this的shared_ptr 通过wek_ptr返回管理this资源的共享智能指针对象shared_ptr。C11中为我们提供了一个模板类叫做std::enable_shared_from_this&#xff0c;这个类中有一个方法叫做shared_from_this()&#xff0c;通过这个方法可以返回一个共享智能指针&#xff0c;在…...

如何去除视频水印?三种简便有效的方法解决视频水印问题

在当今社交媒体时代&#xff0c;视频分享已成为一种流行趋势。然而&#xff0c;很多人在分享自己的作品时却苦于视频上存在的水印&#xff0c;水印通常是出于版权保护或品牌推广的目的而添加到视频中的&#xff0c;但有时它们可能会对用户体验造成负面影响。 如果您正在寻找如何…...

快速构建高质量中文APP登录注册页面Figma源文件

在这个数字化时代&#xff0c;移动应用程序&#xff08;APP&#xff09;已经成为我们日常生活中不可或缺的一部分。如果您正在为您的中文APP开发登录注册页面&#xff0c;并寻找高质量的UI设计素材&#xff0c;那么您来对地方了&#xff01;我们为您提供了一个完整的Figma源文件…...

MySQL库的库操作指南

1.创建数据库 一般格式&#xff1a;create database (if not exists) database1_name,database2_name...... 特殊形式&#xff1a; create database charset harset_name collate collate_name 解释&#xff1a; 红色字是用户自己设置的名称charset&#xff1a;指定数据…...

【单目测距】单目相机测距(三)

文章目录 一、前言二、测距代码2.1、地面有坡度2.2、python代码2.2.1、旋转矩阵转角度2.2.2、角度转旋转矩阵2.2.3、三维旋转原理 (Rotation 原理)2.2.4、完整代码 2.3、c 代码 一、前言 上篇博客【单目测距】单目相机测距&#xff08;二&#xff09; 有讲到当相机不是理想状态…...

Evaluating Large Language Models: A Comprehensive Survey

本文是LLM系列文章&#xff0c;针对《Evaluating Large Language Models: A Comprehensive Survey》的翻译。 评估大型语言模型&#xff1a;一项综合调查 摘要1 引言2 分类和路线图3 知识和能力评估4 对齐评估5 安全评估6 专业LLM评估7 评估组织8 未来方向9 结论 摘要 大型语…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

基于Springboot+Vue的办公管理系统

角色&#xff1a; 管理员、员工 技术&#xff1a; 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能&#xff1a; 该办公管理系统是一个综合性的企业内部管理平台&#xff0c;旨在提升企业运营效率和员工管理水…...

Kafka主题运维全指南:从基础配置到故障处理

#作者&#xff1a;张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1&#xff1a;主题删除失败。常见错误2&#xff1a;__consumer_offsets占用太多的磁盘。 主题日常管理 …...

Netty自定义协议解析

目录 自定义协议设计 实现消息解码器 实现消息编码器 自定义消息对象 配置ChannelPipeline Netty提供了强大的编解码器抽象基类,这些基类能够帮助开发者快速实现自定义协议的解析。 自定义协议设计 在实现自定义协议解析之前,需要明确协议的具体格式。例如,一个简单的…...

iOS 项目怎么构建稳定性保障机制?一次系统性防错经验分享(含 KeyMob 工具应用)

崩溃、内存飙升、后台任务未释放、页面卡顿、日志丢失——稳定性问题&#xff0c;不一定会立刻崩&#xff0c;但一旦积累&#xff0c;就是“上线后救不回来的代价”。 稳定性保障不是某个工具的功能&#xff0c;而是一套贯穿开发、测试、上线全流程的“观测分析防范”机制。 …...

TI德州仪器TPS3103K33DBVR低功耗电压监控器IC电源管理芯片详细解析

1. 基本介绍 TPS3103K33DBVR 是 德州仪器&#xff08;Texas Instruments, TI&#xff09; 推出的一款 低功耗电压监控器&#xff08;Supervisor IC&#xff09;&#xff0c;属于 电源管理芯片&#xff08;PMIC&#xff09; 类别&#xff0c;主要用于 系统复位和电压监测。 2. …...

vue3+el-table 利用插槽自定义数据样式

<el-table-column label"匹配度" prop"baseMatchingLevel"><template #default"scope"><div :style"{ color: scope.row.baseMatchingLevel > 0.8 ? #00B578 : #FA5151 }">{{ scope.row.baseMatchingLevel }}&l…...