TDD简介

TDD(Test Driven Development)测试驱动开发-概述及编码方式 TDD概述 TDD(Test Driven Development)测试驱动开发 TDD定义 一种不同于传统软件开发流程的新型的开发方法。它要求在编写某个功能的代码之前先编写测试代码,然后只编写使测试通过的功能代码,通过测试来推动整个开发的进行。这有助于编写简洁可用和高质量的代码,并加速开发过程。 TDD编码方式 先分解任务,分离关注点 列Example,用实例化需求,澄清需求细节 写测试,只关注需求,程序的输入输出,不关心中间过程 写实现,不考虑别的需求,用最简单的方式满足当前这个小需求 阅读详情

2001年2月《敏捷宣言》签定,宣告了敏捷开发运动的开始。敏捷的开发方式引起越来越多开发者的关注,世界上出现了各种各样的敏捷软件开发方法, SCRUM,Crystal,特征驱动开发(Feature Driven Development,FDD),自适应软件开发(Adaptive Software Development,ADP)以及极限编程(eXtreme Programming,XP) 等等。其中极限编程是敏捷方法中最著名的一个,由Kent Beck在1998年提出,由一系列简单却互相依赖的实践组成。其中对如何开发代码提出了的要求:结对开发+TDD。

关于TDD,可能一些富有经验的程序员会说这个看起来很怪而且似乎没有必要。这些程序员很聪明,他们具有许多经验,他们说不需要先编写测试,因为他们知道自己在做什么。

那么TDD真的没有必要么? 答案否定的, 个人觉得他们没有真正的了解过TDD,下面由我来给大家介绍一下TDD。


什么是TDD

TDD,Test-Driven Development,测试驱动开发。是敏捷开发中的一项核心实践和技术,也是一种设计方法论。TDD的原理是在开发功能代码之前,先编写单元测试用例代码,测试代码确定需要编写什么产品代码。TDD虽是敏捷方法的核心实践,但不只适用于XP,同样可以适用于其他开发方法和过程。 

TDD的重要目的不仅仅是测试软件,测试工作保证代码质量仅仅是其中一部分,更重要的是在开发过程中帮助客户和程序员去除模棱两可的需求。TDD首先考虑使用需求(对象、功能、过程、接口等),主要是编写测试用例框架对功能的过程和接口进行设计,而测试框架可以持续进行验证。 

所以,TDD具有2大特性:

  1. 测试先行
  2. 持续重构


为什么要使用TDD

  1. 我们要看使用TDD能够带来什么:
  • 提高代码质量
  • 保证设计质量
  • 集中精力开发一个功能
  1. TDD为最小的逻辑单元提供了验证:
  • 确保每个方法都是可用的且已被测试过
  • 确保及时发现出现问题的模块
  1. 添加或修改代码更容易
  2. 频繁地运行测试
  3. 迭代式递增开发
  4. 不断重构以改善设计
  1. TDD还能改善和验证设计:
  • 以客户端的视角编写测试
  • 为客户端提供了示例代码
  • 更注重接口的设计
  • 为了使测试容易,需要实现松散耦合
  • 更少的Debug时间
  1. 保证代码重构的安全性
  • 确保每一步重构后功能不变


如何使用TDD

我们知道XP涉及两种测试:程序员测试和客户测试。

TDD(也称为测试为先编程)通常指第一种测试,至少我使用这个术语时是这样。测试驱动的编程是让程序员测试决定你所编写的代码。这意味着我们必须在编写代码之前进行测试。测试指出我们需要编写的代码,从而也决定了我们要编写的代码。我们只需编写足够通过测试的代码即可,Uncle Bob在《Clean Code》一书中强调代码恰好通过测试即可。XP中也有类似的要求:如果不进行程序员测试,则你不知道要编写什么代码,所以你不会去编写任何代码。 

每当新增一个功能时,我们执行以下流程:


pastedGraphic.pdf


1) 明确当前要完成的功能。可以录成一个TODO列表。

2) 快速完成针对此功能的测试用例编写。

3) 测试代码编译不通过。

4) 编写对应的功能代码。

5) 测试通过。

6) 对代码进行重构,并保证测试通过。

7) 循环完成所有功能的开发。

在用TDD编写代码时我们要遵守TDD三定律。这保证每个循环大概在30秒钟,测试代码和生成代码一起编写,测试只比生成代码早写几秒钟。

TDD三定律

  1. 在编写不能通过的单元测试前,不可编写生产代码;
  2. 只可编写刚好无法通过的单元测试,不能编译也算不通过;
  3. 只可编写刚好足以通过当前失败测试的生成代码。


测试范围、粒度

对哪些功能进行测试?会不会太繁琐?什么时候可以停止测试?这些问题比较常见。按 Kent Beck 的话,对那些你认为应该测试的代码进行测试。就是说,要相信自己的感觉,自己的经验。那些重要的功能、核心的代码就应该重点测试。感到疲劳就应该停下来休息一下。感觉没有必要更详细的测试,就停止本轮测试。

测试驱动开发强调测试并不应该是负担,而应该是帮助我们减轻工作量的方法。而对于何时停止编写测试用例,也是应该根据你的经验,功能复杂、核心功能的代码就应该编写更全面、细致的测试用例,否则测试流程即可。

测试范围没有静态的标准,同时也应该可以随着时间改变。对于开始没有编写足够的测试的功能代码,随着bug的出现,根据bug补齐相关的测试用例即可。

小步前进的原则,要求我们对大的功能块测试时,应该先分拆成更小的功能块进行测试,比如一个类A使用了类B、C,就应该编写到A使用B、C功能的测试代码前,完成对B、C的测试和开发。那么是不是每个小类或者小函数都应该测试哪?我认为没有必要。你应该运用你的经验,对那些可能出问题的地方重点测试,感觉不可能出问题的地方就等它真正出问题的时候再补测试吧。


怎么编写测试用例

测试用例的编写就用上了传统的测试技术。

  • 操作过程尽量模拟正常使用的过程。
  • 全面的测试用例应该尽量做到分支覆盖,核心代码尽量做到路径覆盖。
  • 测试数据尽量包括:真实数据、边界数据。
  • 测试语句和测试数据应该尽量简单,容易理解。
  • 为了避免对其他代码过多的依赖,可以实现简单的桩函数或桩类(Mock Object)。
  • 如果内部状态非常复杂或者应该判断流程而不是状态,可以通过记录日志字符串的方式进行验证。


TDD原则

  • 测试隔离

不同代码的测试应该相互隔离。对一块代码的测试只考虑此代码的测试,不要考虑其实现细节(比如它使用了其他类的边界条件)。

  • 一顶帽子

开发人员开发过程中要做不同的工作,比如:编写测试代码、开发功能代码、对代码重构等。做不同的事,承担不同的角色。开发人员完成对应的工作时应该保持注意力集中在当前工作上,而不要过多的考虑其他方面的细节,保证头上只有一顶帽子。避免考虑无关细节过多,无谓地增加复杂度。

  • 测试列表

需要测试的功能点很多。应该在任何阶段想添加功能需求问题时,把相关功能点加到测试列表中,然后继续手头工作。然后不断的完成对应的测试用例、功能代码、重构。一是避免疏漏,也避免干扰当前进行的工作。

  • 测试驱动

这个比较核心。完成某个功能,某个类,首先编写测试代码,考虑其如何使用、如何测试。然后在对其进行设计、编码。

  • 先写断言

测试代码编写时,应该首先编写对功能代码的判断用的断言语句,然后编写相应的辅助语句。

  • 可测试性

功能代码设计、开发时应该具有较强的可测试性。其实遵循比较好的设计原则的代码都具备较好的测试性。比如比较高的内聚性,尽量依赖于接口等。

  • 及时重构

无论是功能代码还是测试代码,对结构不合理,重复的代码等情况,在测试通过后,及时进行重构。关于重构,我会另撰文详细分析。

  • 小步前进

软件开发是个复杂性非常高的工作,开发过程中要考虑很多东西,包括代码的正确性、可扩展性、性能等等,很多问题都是因为复杂性太大导致的。极限编程提出了一个非常好的思路就是小步前进。把所有的规模大、复杂性高的工作,分解成小的任务来完成。对于一个类来说,一个功能一个功能的完成,如果太困难就再分解。每个功能的完成就走测试代码-功能代码-测试-重构的循环。通过分解降低整个系统开发的复杂性。这样的效果非常明显。几个小的功能代码完成后,大的功能代码几乎是不用调试就可以通过。一个个类方法的实现,很快就看到整个类很快就完成啦。本来感觉很多特性需要增加,很快就会看到没有几个啦。你甚至会为这个速度感到震惊。


TDD不仅仅是测试

TDD是设计方法

TDD的基本思路就是通过测试来推动整个开发的进行,但测试驱动开发并不只是单纯的测试工作,而是把需求分析,设计,质量控制量化的过程。 

需求向来就是软件开发过程中感觉最不好明确描述、易变的东西。这里说的需求不只是指用户的需求,还包括对代码的使用需求。很多开发人员最害怕的就是后期还要修改某个类或者函数的接口进行修改或者扩展,为什么会发生这样的事情就是因为这部分代码的使用需求没有很好的描述。测试驱动开发就是通过编写测试用例,先考虑代码的使用需求(包括功能、过程、接口等),而且这个描述是无二义的,可执行验证的。

通过编写这部分代码的测试用例,对其功能的分解、使用过程、接口都进行了设计。而且这种从使用角度对代码的设计通常更符合后期开发的需求。可测试的要求,对代码的内聚性的提高和复用都非常有益。因此测试驱动开发也是一种代码设计的过程。


TDD是学习方式

开发人员通常对编写文档非常厌烦,但要使用、理解别人的代码时通常又希望能有文档进行指导。而测试驱动开发过程中产生的测试用例代码就是对代码的最好的解释。 当你不知道如何使用该类时,可以查看测试,看一个非常具体的示例。这是学习的很好方式。


TDD是信心来源

快乐工作的基础就是对自己有信心,对自己的工作成果有信心。当前很多开发人员却经常在担心:“代码是否正确?”“辛苦编写的代码还有没有严重bug?”“修改的新代码对其他部分有没有影响?”。这种担心甚至导致某些代码应该修改却不敢修改的地步。测试驱动开发提供的测试集就可以作为你信心的来源。

当然测试驱动开发最重要的功能还在于保障代码的正确性,能够迅速发现、定位bug。而迅速发现、定位bug是很多开发人员的梦想。针对关键代码的测试集,以及不断完善的测试用例,为迅速发现、定位bug提供了条件。

程序员可以按一个按钮就运行这些测试。几秒种之后,就可以知道代码是否按我们告诉它应该怎样的方式来运行。这种可回归的工具是很有价值的。团队中的任何人以在任何时候更改代码,甚至在代码发布的前一天也可以更改,因为如果有任何问题,测试会立即告诉他们。作为一名程序员, 这给予了我信心 ― 比大多数程序员具有更大的信心。 


TDD、BDD、DDD简介 1. TDD TDD指的是Test Drive Development,很明显的意思是测试驱动开发,也就是说我们可以从测试的角度来检验整个项目。大概的流程是先针对每个功能点抽象出接口代码,然后编写单元测试代码,接下来实现接口,运行单元测试代码,循环此过程,直到整个单元测试都通过。这一点和敏捷开发有类似之处。 TDD的好处自然不用多说,它能让你减少程序逻辑方面的错误,尽可能的减少项目中的bug, 阅读详情

相关推荐

microblaze之Video Processing Subsystem调试误区

内容:总结video processing subsystem调试中遇到的问题,以及在解决问题中的思路方法论,引为前车之鉴。 1,我的目的是希望采用vps中的scaler模块对图像进行拉伸缩小。IP的配置如下: 2,整个系统的框架图如下,仅比上期的内容增加了scaler模块,如下: 3,查手册,可以知道这个scaler only组件分成了hscale,vscale和GPIO,其中GPIO是控制上下游stream流控设备复位用,暂时忽略。 hscale和vscale的寄存器空间如下,主要关注图

YDY5659150的专栏 3555

五分钟让你彻底了解TDD、ATDD、BDD&RBE

在目前比较流行的敏捷开发模式(如极限编程、Scrum方法等)中,推崇“测试驱动开发(Test Driven Development,TDD)”——测试在先、编码在后的开发实践。TDD有别于以往的“先编码、后测试”的开发过程,而是在编程之前,先写测试脚本或设计测试用例。TDD在敏捷开发模式中被称之为“测试优先的编程(test-first programming)”,而在IBM Rational统一过...

4万+

SAP FICO实操:如何修改已发生业务数据的成本中心公司代码(附RKACOR06程序运行指南)

本文详细解析了SAP FICO系统中使用RKACOR06程序修改已发生业务数据的成本中心和公司代码的实操方法。通过实战案例分享,提供从前期准备到后期验证的全流程指南,帮助企业应对组织架构重组或财务核算体系调整时的数据迁移挑战,特别适用于跨公司代码的成本中心划转场景。

weixin_27303545的博客 189

让人傻傻分不清的TDD、ATDD、BDD

前言导入 作为一名软件开发从业者,想必 你肯定听过以下名词: “TDD" "UTDD" "ATDD" "BDD" ”DDD" ;正如你所见,它们看起来非常相似—— “xDD”。 正是因为,这“外表"的相似性,致使它们在我们眼中就如 孪生兄弟 一般,总是让人傻傻分不清。那如何能分清他们?答:了解、学习它们!只有和它们接触相处,才能对它们有所了解,从而才能有效分清它们。 姓甚名谁 TDD: 英文全称:Test Driven Development ,中文全称:测试驱动...

qq_41998273的博客 3644

树莓派4B安装 ubuntu20.04 & VNC远程桌面 & 安装ROS noetic

树莓派4B安装ubuntu20.04 & VNC远程桌面1、安装ubuntu方式1:下载Imager文件。方式2:下载镜像文件。2、查询树莓派 IP 地址3、使用ssh远程登录树莓派4、更新源地址5、更新6、安装桌面环境7、允许root登陆8、登陆远程桌面9、设置中文 1、安装ubuntu 方式1:下载Imager文件。...

weixin_44415639的博客 2万+

使用JAVA 的 POI 库 将DOC文件转为DOCX文件

java使用POI库,将doc文件转为docx文件

qq_45808266的博客 5706

TDD、FDD是什么意思?

TDD、FDD指第三代移动通信技术(3G)中的两种双工通信模式。 TDD(Time-division Duplex )模式指时分双工模式,3G标准中的TD-SCDMA采用此双工模式; FDD(Frequency-division Duplex)模式指频分双工模式,3G标准中的WCDMA和CDMA2000采用此模式。 一、工作原理 TDD是一种通信系统的双工方式,在移动通信系统中用于分离接收......

魏波 12万+

Python 爬虫实战:爬取电商平台商品信息(价格 / 销量 / 评价)

摘要:本文详细介绍基于Python的电商商品信息爬取技术方案,以京东商品详情页为例,对比分析静态(BeautifulSoup)和动态(Selenium)两种爬取方式的实现逻辑。静态爬取适合获取基础信息,而动态爬取可解决JS渲染数据的获取问题。文章包含完整的代码实现、反爬规避策略及数据存储方案,涵盖商品名称、价格、销量、评价等核心数据提取。同时强调爬虫的合规使用,提供扩展方向建议,为电商数据采集提供实用技术参考。

2503_91057718的博客 2022

【TDD】深度解读 - TDD(测试驱动开发)

有广义和狭义之分,常说的是狭义的 TDD,也就是 UTDD(广义的 TDD 是ATDD),包括BDD)和等。本文所说的 TDD 指狭义上的 TDD,也就是「TDD是敏捷开发中的一项核心实践和技术,也是一种设计方法论。TDD的原理是在开发功能代码之前,。。

qq_43331089的博客 2万+

Sigrity System SI SerialLink模式进行SFP+协议仿真分析-PCB操作指导

Random(Rj):随机抖动,该抖动用高斯概率分布来描述,通常是由热噪声和其它随机噪声引起的,默认为1%UI RMS(平均值),即和标准值的偏差为1%UI。Random(Rj):随机抖动,该抖动用高斯概率分布来描述,通常是由热噪声和其它随机噪声引起的,默认为1%UI RMS(平均值),即和标准值的偏差为1%UI。Random(Rj):随机噪声,是由信号电压的随机波动引起的,默认为1mv RMS(平均值),即和标准值的偏差为1mv。

weixin_54787054的博客 507

【毕业设计】基于雷达与深度学习的摔倒检测——雷达数据集处理

雷达原始数据是时域非平稳信号,快速傅里叶变换(Fast Fourier Transformation, FFT)不能很好地提取微多普勒效应的模式特征。因此短时傅里叶变换(Short Time Fourier Transformation, STFT)被应用于雷达信号的时频谱分析。本文主要介绍雷达数据集的预处理过程,包括时频谱图的中值滤波与 SVD 分解。

洋洋Young的博客 1808

[摘]TDD简介

TDD简介 TDD全称Test Driven Development,是一种软件开发的流程,其由敏捷的“极限编程”引入。其开发过程是从功能需求的test case开始,先添加一个test case,然后运行所有的test case看看有没有问题,再实现test case所要测试的功能,然后再运行test case,查看是否有case失败,然后重构代码,再重复以上步骤。其理念主要是确保两...

dianfanshuai0279的博客 244

SAP-ABAP:SAP IDOC 全面学习指南

SAP-ABAP:SAP IDOC 全面学习指南

baidu_35680696的博客 1616

tdd java_Java TDD简介–第1部分

tdd java 欢迎来到测试驱动开发 (TDD)系列的介绍。 我们将在TDD上下文中讨论Java和JUnit ,但这只是工具。 本文的主要目的是使您全面了解TDD,而无论使用哪种编程语言和测试框架。 如果您在项目中不使用TDD,那么您要么是懒惰的,要么就是根本不知道TDD是如何工作的。 关于缺乏时间的借口不适用于这里。 关于这篇文章 在这篇文章中,我将解释什么是TDD以及如何在Jav...

最佳 Java 编程 554

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

tdd java_Java TDD简介–第2部分

tdd java 再次问好! 在上一篇博客文章中,我在没有紧密引用Java的情况下总体上解释了TDD理论 ,但是在这一部分中,我们开始进行TDD实践。 我们的目标是遍历TDD的所有阶段:从需求分析到测试代码的重构。 我们将在具有Java,JUnit和“ fake”需求的示例中完成所有这些工作。 需求分析 假设我们需要在一个虚构的应用程序中创建一个新功能。 以下用户故事描述了此功能: 作...

最佳 Java 编程 425

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Java TDD简介–第1部分

欢迎来到测试驱动开发 (TDD)系列的介绍。 我们将在TDD上下文中讨论Java和JUnit ,但这只是工具。 本文的主要目的是使您全面了解TDD,而无论使用哪种编程语言和测试框架。 如果您在项目中不使用TDD,那么您要么很懒,要么就是根本不知道TDD的工作方式。 关于缺乏时间的借口不适用于这里。 关于这篇文章 在这篇文章中,我将解释什么是TDD以及如何在Java中使用它。 在TDD...

最佳 Java 编程 801

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

测试驱动开发(TDD)简介

测试驱动开发(TDD)是一种软件工程实践,要求在应该验证的代码之前编写单元测试。 TDD源自敏捷世界,它是极限编程(XP)方法的基本实践,如今,TDD本身已被公认为是一门学科,并且还在敏捷环境之外使用。 概述和实践介绍,您将无法没有! 在过去的15年中,敏捷运动不断发展,从而导致了新的,更务实的实践,旨在为客户提供能够尽快满足其需求的计划。 对于此问题, 基于V模型的传统方法提供了“最后测试”...

编程故事的地方 1838

测试驱动开发tdd_测试驱动开发(TDD)简介

测试驱动开发tdd 测试驱动开发(TDD)是一种软件工程实践,要求在应该验证的代码之前编写单元测试。 TDD源自敏捷世界,它是极限编程(XP)方法的基本实践,如今,TDD本身已被视为一门学科,并已在敏捷环境之外使用。 如果没有概述,那么您将无法做到! 在过去的15年中,敏捷运动不断发展,从而导致了新的,更务实的实践,旨在为客户提供能够尽快满足其需求的计划。 针对此问题, 基于V模型的传统方法...

编程故事的地方 678

TDD简介(转)

TDD = Test Driven Development,是从04年开始软件开发领域的一大热点,google一下英文可以找到大量的内容,不过国内这方面的讨论不多。 顾名思义,TDD是一种测试驱动的开发模式,属于XP-极限编程的核心内容之一。TDD的开发流程是:设计某一功能,编写其测试函数(注意,这时实现这个功能的代码其实还不存在),使测试失败,编写代码,使测试通过,增加新的测试,编写更多的代码...

walkes 244
上一篇: IOS导航控制器
下一篇: Hibernate与MyBatis比较
weeweee
博客等级 码龄16年 10粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值