首先说一下名词解释,TDD,英文名称Test-Driven Development,中文名称测试驱动开发,简单的断下句“测试/驱动/开发”,简单的理解一下,就是测试驱动着开发,大白话就是说用一边测试一边来推进着项目的开发,相似咱们平时说的一步一个脚印,作一件事就把他给作好,每一步都要认真的走下去,保质保量的完成项目。html
TDD是敏捷开发中的一项核心实践和技术,也是一种设计方法论。编程
TDD开发的优势:安全
一、能够保证代码的质量。能够对本身的所须要的业务功能的每一步设计进行验证,并获得正确的结果,减小bug的出现的,特别对于复杂业务逻辑的项目,以小步慢走的方式,避免后期繁重的测试和维护工做。函数
二、找到了重构的信心,必要时候你还能够痛痛快快的而且满怀信心的对代码作一场大的变革。这样咱们的代码变得干净了,扩展性、能够维护性以及易理解性纷至沓来。学习
三、在团队建设中可以进行分工,以可执行的形式文档化你的需求,迫使你分清职责隔离依赖以驱动你的设计,编织安全网以便将Bug扼杀在在摇篮状态,防止其逃逸。不一样于传统开发(传统的开发人员开发的软件的测试是为了找出已经逃逸得bug,可能这个bug已经长成了毒瘤)。注:这两种活动都是必要的,并且绝不冲突,互为补充。测试
四、帮助你养成一个新的思惟习惯,不光在你编程的道路上,在你的工做和生活中,你慢慢的会把本身的需求进行分析设计并不断地验证,最终更好去实现本身的人生目标。编码
TDD开发的缺点:url
一、对于测试驱动不熟练或者喜欢偷懒的的人员,加大了代码的编写量,测试代码是系统代码的两倍或更多。.net
二、可能不适合时间很紧的软件开发,更适合于产品和平台的开发。设计
TDD原则:
独立测试:不一样代码的测试应该相互独立,一个类对应一个测试类(对于C代码或C++全局函数,则一个文件对应一个测试文件),一个函数对应一个测试函数。用例也应各自独立,每一个用例不能使用其余用例的结果数据,结果也不能依赖于用例执行顺序。 一个角色:开发过程包含多种工做,如:编写测试代码、编写产品代码、代码重构等。作不一样的工做时,应专一于当前的角色,不要过多考虑其余方面的细节。
测试列表:代码的功能点可能不少,而且需求多是陆续出现的,任何阶段想添加功能时,应把相关功能点加到测试列表中,而后才能继续手头工做,避免疏漏。
测试驱动:即利用测试来驱动开发,是TDD的核心。要实现某个功能,要编写某个类或某个函数,应首先编写测试代码,明确这个类、这个函数如何使用,如何测试,而后在对其进行设计、编码。
先写断言:编写测试代码时,应该首先编写判断代码功能的断言语句,而后编写必要的辅助语句。
可测试性:产品代码设计、开发时的应尽量提升可测试性。每一个代码单元的功能应该比较单纯,“各家自扫门前雪”,每一个类、每一个函数应该只作它该作的事,不要弄成大杂烩。尤为是增长新功能时,不要为了图一时之便,随便在原有代码中添加功能,对于C++编程,应多考虑使用子类、继承、重载等OO方法。
及时重构:对结构不合理,重复等“味道”很差的代码,在测试经过后,应及时进行重构。
小步前进:软件开发是复杂性很是高的工做,小步前进是下降复杂性的好办法。
怎么作TDD(关键5步)
加入一个新的测试
运行下新加的测试,看到它失败(由于你还没写功能代码)
对开发代码作很小的修改,目的就是让新加的测试经过 (注意这里的目的)
运行全部的测试(test case),而后看到全部测试都经过了 (看到测试都变成绿色,通常都会小开心一下)
移掉重复的代码,对代码进行重构 (既包括功能代码,也包括测试代码。特别注意红色的字串 通常会有重复,还有一些代码能够抽出来变成公用方法,测试代码中一样的初始化和还原测试环境的代码,能够放到intilize和cleanup中去)
而外还有一些步骤也是能够加入的,比方
在写测试代码前,先从需求出发,准备一个Test list (须要测到的功能的列表)。忘掉你该怎么实现,那是后面的事情
每测完一个就用横线划掉
若是发现有漏掉的test 就加到这个列表中(列表测完你的功能也就完成了)
总结:
经过一上午的学习,对TDD(测试驱动开发)有了基本的理解,对TDD的带来的优势有了初步的认识,接下来的学习中,我会转变思想,以“测试先行”的原则来开发稳定高质量的代码,把写测试像写代码注释同样,深刻骨髓。
参考资料:
由衷向如下博客表示感谢,也以便之后查询方便
http://www.cnblogs.com/xiadao521/p/4092846.html
http://blog.csdn.net/m13666368773/article/details/7006912
http://baike.baidu.com/link?url=pbvA3Y5wTfaUMJKHgKtSd3pNuWB08imkCRW0BTVAOc_9TZ5Z7mOn4T6No1Crxvb-Jmp1Wg4xr2uvRyi4cY3OoSqwgVNPkwqzJf-DrxTKQ9e