TDD, what, why, how
TDD是现在很流行的一种软件开发实践。此文一作个人体会总结,二作给对TDD有兴趣的但是还不是很熟悉的同学一个分享。
对TDD本文从三个方面加以说明:What, Why, How.
首先说明什么是TDD。全称是测试驱动开发。从字面可以看出其中包含两层含义。我们把实现产品功能的代码称为产品代码,第一层含义就是编写的代码需要有测试。这些测试也是以代码的形式存在,称为测试代码。因此很容易通过这些测试代码对产品代码进行自动化测试。这些测试可以分为:单元测试,集成测试,功能测试。这些不同种类的测试具体是做什么的会在How的段落加以说明。TDD的第二层含义就是“驱动”二字,也就是说先写测试代码,然后再编写产品代码让测试代码通过。
关于Why,同样从上面提到的两层进行解释。如果没有自动化测试,那么只能使用手工测试。编写自动化测试需要一定的代价,肯定要比手工测试付出更多的工作。但是一旦测试编写出来就可以被反复的使用,把测试人员从繁重而重复的手工测试中解放出来,从而能让他们更多的把精力放在用户体验和探索性测试上。如果产品代码有完备的测试覆盖,那么开发人员就可以放心的去添加新功能,而不用担心自己不知不觉引入的bug或者破坏了之前的功能,因为你可以通过运行一遍之前所有的测试来得到快速的反馈,从而趁热打铁,对代码行进及时修改。那么为什么要测试先行呢。做软件的过程就是把业务需求转换成产品代码的过程。那么首先就要对业务需求进行分析。写文档是一个比较传统的组织和分析需求的手段。但是文档这东西都是用人类的语言写成的,包含了人的主观想法和措辞。不同的人看同一份文档可能会有不同的理解,然后就需要进行反复讨论和确认。另外写过软件的同学大概都会有这样的体会:需求感觉已经说得很明白了,然后着手去写代码,就发现还是有一堆问题,也许是和之前代码有某些相关性,导致该功能不能这样设计,也许还有一些其他的原因。也就是说代码层级的反馈是最真实最直接的。既然如此为什么不把分析好的需求以代码的形式展现出来呢,也就是测试代码。和文档相比,测试代码是严谨的,通过就是通过,不通过就是不通过,不会有人有不同的理解。同样其直接作用在代码库上,可以得到快速反馈。这里可以看到编写测试代码本身就是梳理需求的过程。同时编写测试代码也是设计的过程,因为测试中会去调用现在还不存在的类和类的方法,也就是定义好了实现该功能所需要新加的类或者方法的签名。而且这样的设计过程是从严格严谨的需求出发的,没有任何的预先设计,所以可以保证没有多于无用的设计,所有的被“驱动”出来的接口,类都是为了实现该功能而存在的,这也能在一定程度上节省开发时间。在此基础上进行编码就很靠谱,心里很有底了。
稍微总结下TDD的好处:快速真实的反馈,需求驱动的设计,可以快速反复进行的回归测试,这些都能够很好提高软件开发的质量和速度。当然这些都不是白来的,是需要付出代价的。首先编写测试代码是需要时间的,在后期软件功能进行调整的时候,也要遵循先改测试的原则。有付出,也有好处,这就需要权衡到底是我付出的多还是得到的多。个人认为,在开发人员对工具和技术能够很熟练的掌握的前提下,TDD的好处是很明显的。
说了What和Why,接下来谈谈How。上面提到了不同种类的测试。下面一一加以说明。
- 单元测试。通常这种测试是针对一个类的接口方法来进行的。但是一个类肯定不是单独存在的,一定会对其他一个或者多个类有依赖关系。这时就可以使用mock技术对其依赖的类的行为进行模拟,从而达到单独测试该类的目的。单元测试只涉及到一个类,因此这种测试能够最快速的得到反馈,是最基本的测试类型。
- 集成测试。这种测试往往是一个端到端的测试。也就是说从应用的最前端一直到底层数据库都会进行真实的操作。这样的测试需要进行运行时环境的模拟,测试数据的准备等等。
- 功能测试:这种测试和前面两种的最大区别是它是从用户操作视角出发,再真正的运行环境上模拟用户操作的某个场景。来验证其正确性。
就Java而言,Junit是比较常用的一个测试框架。结合不同的其他工具可以进行多种测试。如结合mock进行单元测试,结合selinum可以做web功能测试。对于单元测试来说,TDD应该被严格的执行,因为它的反馈很直接,很快速。但是对于后两种,一般反馈周期都很长,对于这种测试,需要灵活掌握。但是对于新手来说,最好是严格的执行所有的步骤。等到能够灵活掌握了,再随心所欲的去发挥。
做TDD还不是很久,理解的深度和应用的广度也很有限,欢迎讨论,指教。
转载于:https://www.cnblogs.com/cuiliqiang/archive/2010/12/24/1916384.html
TDD, what, why, how相关推荐
- Golang TDD实践报告:快速排序Quick Sort
Golang TDD实践报告:快速排序Quick Sort [阅读时间:约5分钟] 0.项目需求 1.编写符合项目输入输出的一个测试 2.尝试运行测试 3.先使用最少的代码来让失败的测试先跑起来 4. ...
- 聊一聊工作中如何优雅的通过TDD方式来维护一个高质量的NPM包
背景 最近一直在采用TDD(测试驱动开发)的方式来维护公司内部的一套通用业务逻辑. 既然是应用到公司实际项目中的,那就不能随随便便搭个脚手架来完成了. 调研过程中,发现TypeScript libra ...
- TDD可以驱动设计吗?
前段时间有不少朋友发文讨论TDD引起了比较热烈的反响.我学习和实践TDD有近一年时间了,也希望把自己对TDD的理解拿出来讨论分享.本文讲讨论TDD的精髓和盲区,并希望引导TDD的初学者正确认识&quo ...
- [01]关于TDD、BDD和DDD的一些看法
在实际的项目中,我们可能随时面对各种不同的需求,它的各个方面的要素决定了我们所采用的开发模式. 比如,它的复杂度如何?所有的需求是否足够清晰?开发人员对相关的业务是否足够了解?项目的工期是否合理?种种 ...
- 网络资源(9) - TDD视频
2014_08_26 http://v.youku.com/v_show/id_XMzI4Mzk1MjQ4.html TDD测试驱动开发 转载于:https://www.cnblogs.com/thl ...
- TDD 与 BDD 仅仅是语言描述上的区别么?
当然不是了,通过这个问题,我顺便跟大家聊聊 ATDD,TDD,BDD3者的区别,方便大家有一个清晰的认识和了解. ATDD: Acceptance Test Driven Development(验收 ...
- TDD与FDD技术对比
双工(Duplex)是一种在单一通信信道上实现双向通信的过程,包括两种类型,分别为半双工和全双工. 在半双工系统中,通信双方使用单一的共享信道轮流发送数据.双向广播就采用了这种方式.在一方发送数据时, ...
- TDD 与 CI 在 Python 中的实践
社区化产品的长久生存之道可能莫过于对迭代周期的控制.还记得以前采用老土的阶段开发的年代,将软件生命周期分为各个阶段,当到达每个阶段的里程碑则集中所有的资源.人力作全面冲刺.每次到了里程碑的检查点冲过了 ...
- 4G EPS 中的 FDD/TDD 无线帧
目录 文章目录 目录 前文列表 无线帧 FDD 与 TDD 的区别 FDD 无线帧 TDD 无线帧 前文列表 <移动通信网络中的资源类型> 无线帧 LTE 支持两种类型的无线帧:FDD(F ...
最新文章
- 麦肯锡季刊 | 人工智能的发展与障碍
- 脚本中的关于‘/xff‘字符记录
- 程序时序图 Sequence Diagram(序列图) UML图(数据流程图)的绘制
- imagepreview使用案例_微信小程序wx.previewImage预览图片实例详解
- 在已有SQL 2005 Server 群集中添加节点
- 分块试水--CODEVS5037 线段树练习4加强版
- Qt Creator将对象连接到信号
- oralce insert 时,出现的两个错误,以及解决方法
- 小程序wafer2操作数据库
- 第一次部署海康威视DEMO的一些坑,最终运行成功
- 清算中的二清是什么东东
- 银行贷款违约风险预测
- 用友漏洞php,Phpwind GET型CSRF任意代码执行漏洞公开
- 多自由度机械臂运动学正-逆解|空间轨迹规划控制|MATLAB仿真+实际机器调试
- 【拍摄日志五】拍摄手法,画面构图,光影关系
- 美杂志公布全球最重要六大科学实验(组图)
- 泰森多边形的matlab实现
- GitHub上最火的Android开源项目整理
- shader 法线UV扭曲(类似金箔纸效果)(SurfaceShader)
- python语法详解_关于python:NLTK中解析的英语语法
热门文章
- python【力扣LeetCode算法题库】20- 有效的括号(辅助栈)
- Python程序设计题解【蓝桥杯官网题库】 DAY11-算法训练
- mysql服务器的启动方式有哪几种_Mysql启动的方式(四种)
- 718保时捷spyder_我要买保时捷718 Spyder的原因:新手也可以玩手动
- python调用接口requests_【python接口自动化】- 使用requests库发送http请求
- 网络推广网站浅析如何做好关键词布局优化?
- long转string类型_从php内核角度分析php弱类型
- 考c语言三级需要什么软件,全国计算机三级网络技术上机考C语言的软件是什么哈?...
- excel 进行二叉树_基础扩展 | 21. 遍历二叉树
- ida android sign加密,最右sign-v2签名算法追踪及逆向还原