培训服务 | PMP认证 | PgMP认证 设为首页 收藏本站 关于我们 联系我们
测试驱动开发
发布者:ChinaRDM.com 来源:中科永联 点击: 发表日期:2007-05-25

     因业务需要,“中科永联”正式更名为“中程在线”,欢迎大家浏览新网站“中程在线信息产业培训网” 

     测试驱动开发(Test-Driven Development,TDD)是通过测试定义所要开发的功能的接口,然后实现功能的开发过程。

      Test-Driven Development(TDD),是Extreme Programming (XP)--极限编程的一个重要组成部分。 

      在上面的图中,列出的的是XP的12个团队实践。Test-Driven Development是其中之一。

      Kent Beck 的著作TDD(Test Driven Development) 中详细讲述了测试驱动开发。

      当你使用TDD的时候一定要说明是测试驱动开发还是测试驱动设计。这两者是有区别的。测试驱动开发,是通过测试定义所要开发的功能的接口,然后实现功能的开发过程。对于测试驱动设计,在XP中似乎已经消失了,而是被测试驱动开发所取代。另外在XP中有用于描述设计的,SimpleDesign ,Design Improvement.

一、测试驱动开发的基本过程

      1) 明确当前要完成的功能。可以记录成一个 TODO 列表。
      2) 快速完成针对此功能的测试用例编写。
      3) 测试代码编译不通过。
      4) 编写对应的功能代码。
      5) 测试通过。
      6) 对代码进行重构,并保证测试通过。
      7) 循环完成所有功能的开发。

二、测试驱动开发的原则

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

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

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

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

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

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

      7)及时重构。无论是功能代码还是测试代码,对结构不合理,重复的代码等情况,在测试通过后,及时进行重构。

三、测试驱动开发的测试范围

      按大师 Kent Benk 的话,对那些你认为应该测试的代码进行测试,测试驱动开发强调测试并不应该是负担,而应该是帮助我们减轻工作量的方法。

四、TDD的优点

      『充满吸引力的优点』 

      完工时完工。表明我可以很清楚的看到自己的这段工作已经结束了,而传统的方式很难知道什么时候编码工作结束了。 
      全面正确的认识代码和利用代码,而传统的方式没有这个机会。 
      为利用你成果的人提供Sample,无论它是要利用你的源代码,还是直接重用你提供的组件。 
      开发小组间降低了交流成本,提高了相互信赖程度。 
      避免了过渡设计。 
      系统可以与详尽的测试集一起发布,从而对程序的将来版本的修改和扩展提供方便。 
      TDD给了我们自信,让我们今天的问题今天解决,明天的问题明天解决,今天不能解决明天的问题,因为明天的问题还没有出现(没有TestCase),除非有TestCase否则我决不写任何代码;明天也不必担心今天的问题,只要我亮了绿灯。 

      『不显而易见的优点』 

      逃避了设计角色。对于一个敏捷的开发小组,每个人都在做设计。 
      大部分时间代码处在高质量状态,100%的时间里成果是可见的。 
      由于可以保证编写测试和编写代码的是相同的程序员,降低了理解代码所花费的成本。 
      为减少文档和代码之间存在的细微的差别和由这种差别所引入的Bug作出杰出贡献。 
      在预先设计和紧急设计之间建立一种平衡点,为你区分哪些设计该事先做、哪些设计该迭代时做提供了一个可靠的判断依据。 

      『有争议的优点』 

       事实上提高了开发效率。每一个正在使用TDD并相信TDD的人都会相信这一点,但观望者则不同,不相信TDD的人甚至坚决反对这一点,这很正常,世界总是这样。 
      发现比传统测试方式更多的Bug。 
      使IDE的调试功能失去意义,或者应该说,避免了令人头痛的调试和节约了调试的时间。 
      总是处在要么编程要么重构的状态下,不会使人抓狂。(两顶帽子) 
      单元测试非常有趣。

[1] [2] 下一页

发 表 评 论 相 关 信 息
姓名: 邮箱:
内容:
全部评论
  • 软件测试驱动开发与极限编程中设计的关系
  • 软件测试驱动开发与极限编程中人的关系
  • 软件测试驱动开发与极限编程核心价值的关系
  • 试谈软件测试驱动开发理论与实践
  • 测试驱动开发(TDD)介绍中的误区
  • 测试驱动开发—一种真正的工程化开发实践 (转
  • 共创国际项目管理顾问旗下网站:中国研发管理网 | 项目管理者联盟 | 中国工程管理网
    Copyright © 2005-2014 ChinaRDM.COM 研发管理网 All rights reserved. 京ICP证060517号