|
|||||
![]() |
|||||
| 您现在的位置: 软件测试时代 >> 软件测试技术 >> 测试管理 >> 文章正文 |
|
|||||
| 最佳实践:测试驱动开发全功略 | |||||
作者:未知 文章来源:网络 点击数: 更新时间:2006-9-23 ![]() |
|||||
|
{关键字} 测试驱动开发/Test Driven Development/TDD {TDD的目标} Clean Code That Works 这句话的含义是,事实上我们只做两件事情:让代码奏效(Work)和让代码洁净(Clean),前者是把事情做对,后者是把事情做好。想想看,其实我们平时所做的所有工作,除去无用的工作和错误的工作以外,真正正确的工作,并且是真正有意义的工作,其实也就只有两大类:增加功能和提升设计,而TDD 正是在这个原则上产生的。如果您的工作并非我们想象的这样,(这意味着您还存在第三类正确有意义的工作,或者您所要做的根本和我们在说的是两回事),那么这告诉我们您并不需要TDD,或者不适用TDD。而如果我们偶然猜对(这对于我来说是偶然,而对于Kent Beck和Martin Fowler这样的大师来说则是辛勤工作的成果),那么恭喜您,TDD有可能成为您显著提升工作效率的一件法宝。请不要将信将疑,若即若离,因为任何一项新的技术——只要是从根本上改变人的行为方式的技术——就必然使得相信它的人越来越相信,不信的人越来越不信。这就好比学游泳,唯一能学会游泳的途径就是亲自下去游,除此之外别无他法。这也好比成功学,即使把卡耐基或希尔博士的书倒背如流也不能拥有积极的心态,可当你以积极的心态去成就了一番事业之后,你就再也离不开它了。相信我,TDD也是这样!想试用TDD的人们,请遵循下面的步骤: 编写TestCase –> 实现TestCase –> 重构 [友情提示:敏捷建模中的一个相当重要的实践被称为:Prove it With Code,这种想法和TDD不谋而合。] {TDD的优点} 『充满吸引力的优点』 完工时完工。表明我可以很清楚的看到自己的这段工作已经结束了,而传统的方式很难知道什么时候编码工作结束了。 『不显而易见的优点』 逃避了设计角色。对于一个敏捷的开发小组,每个人都在做设计。 事实上提高了开发效率。每一个正在使用TDD并相信TDD的人都会相信这一点,但观望者则不同,不相信TDD的人甚至坚决反对这一点,这很正常,世界总是这样。 {TDD的步骤} 步骤 制品 {FAQ} [什么时候重构?] [什么时候设计?] [什么时候增加新的TestCase?] [TestCase该怎么写?] [TDD能帮助我消除Bug吗?] 但是,如果要问“测试”和“除虫”之间有什么联系,我相信还是有很多话可以讲的,比如TDD事实上减少了bug的数量,把查找bug战役的关注点从全线战场提升到代码战场以上。还有,bug的最可怕之处不在于隐藏之深,而在于满天遍野。如果你发现了一个用户很不容易才能发现的bug,那么不一定对工作做出了什么杰出贡献,但是如果你发现一段代码中,bug的密度或离散程度过高,那么恭喜你,你应该抛弃并重写这段代码了。TDD避免了这种情况,所以将寻找bug的工作降低到了一个新的低度。 [我该为一个Feature编写TestCase还是为一个类编写TestCase?] 我们的研究结果表明,通常在一个特性的开发开始时,我们针对特性编写测试用例,如果您发现这个特性无法用TestCase表达,那么请将这个特性细分,直至您可以为手上的特性写出TestCase为止。从这里开始是最安全的,它不会导致任何设计上重大的失误。但是,随着您不断的重构代码,不断的重构 TestCase,不断的依据TDD的思想做下去,最后当产品伴随测试用例集一起发布的时候,您就会不经意的发现经过重构以后的测试用例很可能是和产品中的类/方法一一对应的。 [什么时候应该将全部测试都运行一遍?] [什么时候改进一个TestCase?] 但是,美国人的想法其实跟我们还是不太一样,拿托尼巴赞的MindMap来说吧,其实画MindMap只是为了表现自己的思路,或记忆某些重要的事情,但托尼却建议大家把MindMap画成一件艺术品,甚至还有很多艺术家把自己画的抽象派MindMap拿出来帮助托尼做宣传。同样,大师们也要求我们把TestCase写的跟代码一样质量精良,可我想说的是,现在国内有几个公司能把产品的代码写的精良??还是一步一步慢慢来吧。 [为什么原来通过的测试用例现在不能通过了?] [我怎么知道那里该有一个方法还是该有一个类?] [我要写一个TestCase,可是不知道从哪里开始?] [为什么我的测试总是看起来有点愚蠢?] [什么场合不适用TDD?] {Best Practise} [微笑面对编译错误] 另外,编译器还有一个优点,那就是以最敏捷的身手告诉你,你的代码中有那些错误。当然如果你拥有Eclipse这样可以及时提示编译错误的IDE,就不需要这样的功能了。 [重视你的计划清单] [废黜每日代码质量检查] 此外,对于每日代码质量检查的另一个好处,就是帮助你认识自己的代码,全面的从宏观、微观、各个角度审视自己的成果,现在,当你依照TDD做事时,这个优点也不需要了,还记得前面说的TDD的第二个优点吗,因为你已经全面的使用了一遍你的代码,这完全可以达到目的。 但是,问题往往也并不那么简单,现在有没有人能告诉我,我如何全面审视我所写的测试用例呢?别忘了,它们也是以代码的形式存在的哦。呵呵,但愿这个问题没有把你吓到,因为我相信到目前为止,它还不是瓶颈问题,况且在编写产品代码的时候你还是会自主的发现很多测试代码上的没考虑到的地方,可以就此修改一下。道理就是如此,世界上没有任何方法能代替你思考的过程,所以也没有任何方法能阻止你犯错误,TDD仅能让你更容易发现这些错误而已。 [如果无法完成一个大的测试,就从最小的开始] [尝试编写自己的xUnit] [善于使用Ctrl-C/Ctrl-V来编写TestCase] [永远都是功能First,改进可以稍后进行] [淘汰陈旧的用例] [用TestCase做试验] [TestCase之间应该尽量独立] [不仅测试必须要通过的代码,还要测试必须不能通过的代码] [编写代码的第一步,是在TestCase中用Ctrl-C] [测试用例包应该尽量设计成可以自动运行的] [只亮一盏红灯] [用TestCase描述你发现的bug] {关于单元测试} 单元测试的目标是 Keep the bar green to keep the code clean 这句话的含义是,事实上我们只做两件事情:让代码奏效(Keep the bar green)和让代码洁净(Keep the code clean),前者是把事情做对,后者是把事情做好,两者既是TDD中的两顶帽子,又是xUnit架构中的因果关系。 单元测试作为软件测试的一个类别,并非是xUnit架构创造的,而是很早就有了。但是xUnit架构使得单元测试变得直接、简单、高效和规范,这也是单元测试最近几年飞速发展成为衡量一个开发工具和环境的主要指标之一的原因。正如Martin Fowler所说:“软件工程有史以来从没有如此众多的人大大收益于如此简单的代码!”而且多数语言和平台的xUnit架构都是大同小异,有的仅是语言不同,其中最有代表性的是JUnit和NUnit,后者是前者的创新和扩展。一个单元测试框架xUnit应该:1)使每个TestCase独立运行;2)使每个TestCase可以独立检测和报告错误;3)易于在每次运行之前选择TestCase。下面是我枚举出的xUnit框架的概念,这些概念构成了当前业界单元测试理论和工具的核心: [测试方法/TestMethod] [测试用例/TestCase] [测试容器/TestSuite] [断言/Assertion] [测试设备/TestFixture] [期望异常/Expected Exception] [种类/Category] [忽略/Ignored] [测试执行器/TestRunner] {实例:Fibonacci数列} 下面的Sample展示TDDer是如何编写一个旨在产生Fibonacci数列的方法。 public void testFab() { public int fib( int n ) { public void testFab() { public void testFab() { public int fib( int n ) { public void testFab() { public int fib( int n ) { public int fib( int n ) { public void testFab() { public int fib( int n ) { public void testFab() { for (int i = 0; i < cases.length; i++) //the rest elements {关于本文的写作} 在本文的写作过程中,作者也用到了TDD的思维,事实上作者先构思要写一篇什么样的文章,然后写出这篇文章应该满足的几个要求,包括功能的要求(要写些什么)和性能的要求(可读性如何)和质量的要求(文字的要求),这些要求起初是一个也达不到的(因为正文还一个字没有),在这种情况下作者的文章无法编译通过,为了达到这些要求,作者不停的写啊写啊,终于在花尽了两个月的心血之后完成了当初既定的所有要求(make the bar green),随后作者整理了一下文章的结构(重构),在满意的提交给了Blog系统之后,作者穿上了一件绿色的汗衫,趴在地上,学了两声青蛙叫。。。。。。。^_^ {后记:Martin Fowler在中国} 从本文正式完成到发表的几个小时里,我偶然读到了Martin Fowler先生北京访谈录,其间提到了很多对测试驱动开发的看法,摘抄在此: Martin Fowler:当然(值得花一半的时间来写单元测试)!因为单元测试能够使你更快的完成工作。无数次的实践已经证明这一点。你的时间越是紧张,就越要写单元测试,它看上去慢,但实际上能够帮助你更快、更舒服地达到目的。 ——《程序员》,2005年7月刊 {鸣谢} fhawk |
|||||
| 文章录入:seanhe 责任编辑:seanhe | |||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | |||||
| 最新热点 | 最新推荐 | 相关文章 | ||
| 测试驱动开发---Rss Reader … 感悟测试驱动开发 |
网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 关于我们 | | |
| 版权所有(C) 2003-2006 测试时代 北京慧灵科技有限公司 站长:测试时代(TestAge.net) | |