TDD和BDD的区别 (TDD vs BDD)

article/2025/10/15 17:55:07

前言

如果你关注软件开发最佳实践方面的话题,你肯定听说过测试驱动开发(TDD - Test Driven Development) 和行为驱动开发(BDD - Behavior Driven Development)。这篇文章会为你阐述这两种模式的含义并举例,同时对二者进行比较。

测试驱动开发 (TDD)

当我第一次听到TDD这个词,从字面上理解,觉得很简单,就是用于驱动软件开发的测试。

这没有错,如果对TDD作进一步的解释,这个过程可以进一步分解为5个步骤:

  1. 首先,开发者在码业务前写一些测试用例
  2. 运行这些测试用例。结果肯定是运行失败,因为测试用例中的业务逻辑还没实现嘛
  3. 开发者实现测试用例中的业务逻辑
  4. 再运行测试用例, 如果开发者代码能力不错,这些测试用例应该可以跑通了(pass)
  5. 对业务代码及时重构,包括增加注释,清理重复等。因为没人比开发者自己更了解哪些代码会对哪些部分造成影响从而导致测试失败(fail)

当需要开发新需求新功能时,重复上述步骤。流程如下图所示:

在这里插入图片描述

TDD举例

我们通过举例来了解一下如何实践TDD。例子中的代码可以从github上获取tdd-vs-bdd。将代码clone下来,执行命令npm install && grunt

假设我们想写一个计算阶乘的函数(这是一个很刻意的例子,但是这个例子对我们指出TDD和BDD的区别很有帮助)。TDD的常用方式是运行某函数,然后断言结果满足某个值

在阶乘的例子中,我们使用的javascript测试框架是Mocha。废话不说,上代码:

var assert = require('assert'),factorial = require('../index');suite('Test', function (){setup(function (){// Create any objects that we might need});suite('#factorial()', function (){test('equals 1 for sets of zero length', function (){assert.equal(1, factorial(0));});test('equals 1 for sets of length one', function (){assert.equal(1, factorial(1));});test('equals 2 for sets of length two', function (){assert.equal(2, factorial(2));});test('equals 6 for sets of length three', function (){assert.equal(6, factorial(3));});});
});
  • 显然上述测试会失败,因为我们尚未实现函数功能。所以接下来我们需要实现满足上述测试用例的阶乘函数。代码如下:
    module.exports = function (n) {if (n < 0) return NaN;if (n === 0) return 1;return n * factorial(n - 1);
    };
    

    现在我们再次运行测试用例,所有的case都跑通了! 这就是TDD的使用方式。

我们接着来学习BDD,看它与TDD有什么不同。

行为驱动开发 (BDD)

BDD是什么? 很多人都会感到很模糊。 有人说它与TDD类似,有人说它是对TDD做了扩展。

抛开晦涩的定义,我们只需要记住一点:BDD旨在消除TDD过程中可能造成的问题

与TDD相比,BDD是通过编写行为和规范来驱动软件开发。 行为和规范可能看起来与测试非常相似,但是它们之间却有着微妙但重要的区别。

BDD举例

我们还以讲解TDD中用到的阶乘函数为例:

var assert = require('assert'),factorial = require('../index');describe('Test', function (){before(function(){// Stuff to do before the tests, like imports, what not});describe('#factorial()', function (){it('should return 1 when given 0', function (){factorial(0).should.equal(1);});it('should return 1 when given 1', function (){factorial(1).should.equal(1);});it('should return 2 when given 2', function (){factorial(2).should.equal(2);});it('should return 6 when given 3', function (){factorial(3).should.equal(6);});});after(function () {// Anything after the tests have finished});
});

看出TDD和BDD的区别了吗?其实就是措辞。BDD的描述采用了更加’繁琐’的描述风格,阅读BDD的测试用例就像是阅读一篇文档。

这正是为什么我说BDD旨在消除TDD过程中可能造成的问题的原因所在。BDD赋予的这种像阅读句子一样阅读测试的能力有助于带来对测试认知上的转变,有助于我们去考虑如何更好写测试。当你可以流畅的阅读自己写的测试,你自然可以写出更好更全面的测试用例。

尽管上面的举例非常简单,当我们可以看出:BDD更注重功能本身而非单纯的测试用例运行结果。这也是我们经常听到的一句关于BDD本质的另外一种表达方式:BDD帮助开发人员设计(design)软件,TDD帮助开发人员测试(test)软件

TDD vs BDD

在TDD和BDD之间做选择不是件容易的事。这取决于开发者使用的语言是否有合适的测试框架,小组的同学们是否适应对应框架的用法等等。

有人总是声称BDD优于TDD,因为BDD有助于消除TDD开发中可能产生的问题(issue)。

BDD可能有助于防止问题,但并不能保证消除所有问题。一些由糟糕的代码结构,不好的编程实践引发的问题不可能通过BDD就可以消除的。只是如果开发者BDD测试写的很糟糕,那基本上也不可能开发出健壮的功能。


http://chatgpt.dhexx.cn/article/s6d7jZYs.shtml

相关文章

行为驱动开发(BDD)全面介绍

行为驱动开发&#xff08;BDD&#xff09;全面介绍 作者&#xff1a;杜铁绳 在软件行业中&#xff0c;软件研发项目软件产品交付经常被推迟、研发费用经常超出预算、经常遗漏客户所需的软件功能、有将近20%的项目最终无法交付&#xff0c;或者取消。这些软件研发往往花费了大…

web自动化测试进阶篇02 ——— BDD与TDD的研究实践

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;【Austin_zhai】 &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xff0c;分享行业相关最新信息。…

全面理解BDD(行为驱动开发):转变思维方式,提升软件质量

在传统的软件开发流程中&#xff0c;开发人员和测试人员的工作通常是相互独立的。开发人员负责编写代码&#xff0c;测试人员负责找出代码中的问题。然而&#xff0c;这种方法可能导致沟通不足&#xff0c;而且会浪费时间和资源。为了解决这些问题&#xff0c;出现了一种新的开…

BDD - 介绍 Behavior-Driven Development 行为驱动开发

BDD - Behavior-Driven Development 行为驱动开发 引言什么是 BDD相关软件开发流程TDDATDDBDD 和 TDD 的关系 BDD 原则BDD 流程BDD 优势 引言 自从接触到 BDD&#xff0c;深有感触&#xff0c;BDD 是广大 QA 的福音&#xff0c;测试领域的天空豁然开朗。BDD 模式更有助于团队合…

BDD自动化测试

BDD&#xff08;行为驱动开发&#xff09;自动化测试在软件测试领域一直在发展。随着agile思想在越来越多的项目中推广&#xff0c;以及非开发人员在项目的更多参与&#xff0c;BDD风格的自动化测试被越来越多项目组采纳并实施。 BDD&#xff08;Behavior Driven Development&…

端到端视频编码:DVC

本文来自CVPR 2019论文《DVC: An End-to-end Deep Video Compression Framework》 官方开源代码地址&#xff1a;https://github.com/GuoLusjtu/DVC DVC是一个端到端的视频编码模型&#xff0c;之前也有过一些基于DNN的视频编码方法&#xff0c;但是通常是使用DNN模型替换视频…

主流视频编码压缩技术基本概念(二) 算法分析

主流视频编码压缩技术基本概念&#xff08;二&#xff09; 算法分析 一、MPEG-1技术介绍1、 MPEG-1的层次及语法结构①、运动补偿序列(Sequence)②、图片组&#xff08;GOP&#xff09;③、 图片&#xff08;Picture&#xff09;④、 图片切片&#xff08;Slice&#xff09;⑤、…

视频编码解码基本知识

最近在做摄像头视频的数据处理&#xff0c;得到了网络相机的.h264格式的数据&#xff0c;需要做解码处理&#xff0c;由于对视频的编码解码原理不太了解&#xff0c;因此查找资料总结一下 为什么要进行视频编码&#xff1f; 视频编码又称为视频压缩&#xff0c;伴随着用户对高…

FFMpeg 实现视频编码、解码

FFMpeg 作为音视频领域的开源工具,它几乎可以实现所有针对音视频的处理,本文主要利用 FFMpeg 官方提供的 SDK 实现音视频最简单的几个实例:编码、解码、封装、解封装、转码、缩放以及添加水印。 接下来会由发现问题->分析问题->解决问题->实现方案,循序渐进的完成。…

感知视频编码

感知视频编码就是在视频编码的过程中&#xff0c;将HVS应用进去&#xff0c;挖掘主观视频感知冗余&#xff0c;进一步提高视频编码压缩效率。 1.Computational visual perception:三种视觉感知计算模型 &#xff08;1&#xff09;视觉敏感模型 &#xff08;2&#xff09;视觉注…

Android视频编码的坑

视频开发是一个核心方向&#xff0c;那Camera开发一直是Android的一个核心&#xff0c;笔者做过Camera HAL&#xff0c;也做过Camera App, 同时也开发过Camera 滤镜&#xff0c;这个过程中也遇到和解决过很多棘手的问题&#xff0c;也一直想总结一篇&#xff0c;看到这篇后感觉…

视频编码未来简史

首先我们回顾一下视频编码的历史&#xff0c;视频编码起源于广播电视&#xff0c;在很长一段时间里视频编解码的变革主要推动力是来自于广播电视。当然&#xff0c;今天我们看互联网的视频编码是速度越来越快&#xff0c;昨天在ICET2017年世界大会上&#xff0c;ICET的主席还说…

PCS2021:针对游戏内容的视频编码工具分析和数据集

本文来自PCS2021论文《Video Coding Tool Analysis and Dataset for Gaming Content》 随着近几年游戏市场的逐渐壮大&#xff0c;新的游戏形态&#xff08;AR、VR、云游戏等&#xff09;逐渐发展。和传统的摄像机内容和屏幕内容相比&#xff0c;游戏内容有着不同的特点导致对于…

视频编码综述

你用手机、电脑看电影追剧时&#xff0c;是看的高清还是标清&#xff1f;我想只要网速够得上应该没有人愿意再看标清了吧&#xff01;毕竟高清视频的高分辨率和清晰画质总是能让人有更好的观影体验。 伴随着用户对高清视频的需求量的增加&#xff0c;视频多媒体的视频数据量也在…

混合视频编码方法

参考文献&#xff1a; IP网络视频传输&#xff1a;技术、标准和应用 朱秀昌&#xff0c;唐贵进。--北京&#xff1a;人民邮电出版社&#xff0c;2017.9 预测编码和变换编码是混合编码的基础&#xff0c;当然除此之外还有运动估计、运动补偿、量化、熵编码、去方块滤波等。下面…

【视频编解码-02】视频编码的目的、条件和目标

视频编码&#xff0c;是视频处理中的一个核心技术。 现代我们所看到的所有视频&#xff0c;包括电视、互联网、手机等等&#xff0c;几乎所有的视频都会被编码、解码。 整个视频技术的基本流程是&#xff1a;视频数据的采集、视频数据的编码、视频数据的传输、视频数据的解码、…

【视频】视频文件格式和视频编码

我们经常在电脑、电视、手机或者其他终端产品看视频&#xff0c;我们对视频有个大概了解&#xff0c;比如清晰度、大小、视频类型等&#xff0c;但是对于视频内部结构我们应该一无所知&#xff0c;现在我们来一步一步解开视频的神秘面纱。 首先大家要清楚两个概念&#xff0c;视…

H.265视频编码原理总结

H.265视频编码原理总结 转载地址 1 概述 H.265&#xff08;HEVC High Efficiency Video Coding&#xff09;是现行H.264标准于2003年实现标准化以来时隔10年推出的新标准&#xff0c;将成为支撑未来十年的影像服务和产品的视频压缩技术。其特点是&#xff0c;支持1080p以上的…

视频编码流程详解

1、视频编码整体流程 2、FFmpeg视频编码详细流程 从本地读取YUV数据编码为H264格式的数据&#xff0c;然后再存入到本地&#xff0c;编码后的数据有带startcode。 与FFmpeg示例音频编码的流程基本一致。 3、关键函数说明 &#xff08;1&#xff09;avcodec_find_encoder_by_n…

视频编码知识

记录一下学习视频编码的过程和自己的理解 视频 数字图像在计算机中的表示&#xff1a;二维矩阵&#xff0c;或三维矩阵&#xff08;彩色&#xff09;。 矩阵中的每个点为像素&#xff0c;数值的大小反应色彩的强度&#xff0c;颜色深度需要使用一定数据空间存储&#xff0c;每…