浅析测试驱动开发

摘 要:测试驱动开发是一种用于敏捷软件开发的开发过程,可以快速应对需求变化。它要求先设计和编写测试代码,然后编写功能代码通过所有测试,再重构以提高代码质量。文章将先介绍测试驱动开发的优点、使用环境,然后介绍开发过程,最后介绍相关工具。

关键词:测试;TDD;敏捷开发

1 概述

1.1 定义

测试驱动开发(Test Driven Development, TDD)是由极限编程之父Kent Beck提出的一种面向对象的开发方法[1]。区别于传统的软件开发模式,测试先行将更重视测试在整个软件开发过程中的作用并促进项目的进行。它要求先完成测试代码,然后编写功能代码,并且功能代码要以通过测试代码为标准,然后对功能代码重构,重构之后再运行测试并要通过测试[2]。它的一个开发周期比较短,整个项目是多个周期的迭代。这种开发方式有效的提高了软件质量和开发效率[3]。目前,TDD已经被很多公司和开发团队接受并用于实践。

1.2 优点

由于测试先行,因此写代码前就应该有明确的需求,并体现在测试用例中。在交付前,测试用例可以用来描述功能需求并替代部分文档。并且以测试用例描述的需求不容易出现模糊不清的概念,因为测试结果只会是True或False。这解决了开发人员在开发时误解或由于沟通问题不完全理解需求文档而造成开发到一定程度后才发现代码与需求有偏差。但这还没有解决对客户的误解或与客户沟通不畅导致需求分析错误的问题。

功能代码编写完成后必须通过所有测试,这就保证了这部分代码是满足其功能要求的。通过确保每小部分代码的质量,可以较快的叠加成更复杂的功能且保证最后交付的软件与设计的要求是一致的。在对功能代码进行优化时,因为也要通过测试用例,所以能保证这部分代码的改动不会对调用它的其他模块有影响。

1.3 适用环境

尽管从理论上讲TDD可以在各种软件开发项目中使用,但是在某些项目上可能感觉不到比较明显的效率提升或质量提高。

TDD是面向对象的开发方式,如果项目不使用面向对象的设计和开发,则不适合使用TDD。

GUI等难以进行单元测试或进行测试比较麻烦的部分也不适宜使用TDD的开发方式。因为TDD是以测试驱动的,虽然测试是软件交付内容的一部分,但是如果测试部分的难度大于软件功能的开发,且消耗更多的时间,那么就无法再提高整个项目的开发效率。

TDD还对设计有很高的要求。设计的结果直接影响到测试用例,如果测试用例没有被很好的设计,会严重影响软件的开发。

2 应用

2.1 开发流程

2.1.1 设计

在各种开发方式中,设计都是非常重要的一个环节,它在很大程度上影响了软件开发的难度、质量。在传统的软件设计方法中,需求分析的结果通常以文档、UML***、伪代码等方式表示出来。在TDD中,一般可以使用测试用例来表示各个模块的功能说明。测试用例可以明确地表示每个功能模块要完成的功能和期望得到的结果,且不容易产生误解。

设计单元测试用例时,一个比较难以把握的问题是测试用例的粒度。如果粒度太粗,可能会导致模块内实现的功能过多、难以测试等问题,并没有达到TDD的效果。TDD一般提倡小步前进。但也不能太细。粒度太细可能导致测试用例数量过多、维护测试用例过于麻烦。

2.1.2 创建测试用例

设计完测试用例以后,要实现测试用例。测试用例将保证功能代码完成了设计的功能。在没有写功能代码前,测试用例应该是无法通过的,因为需要完成的功能没有完成。

测试用例还在一定程度上起到了文档的作用。在TDD的开发方式中,测试用例可以说明某个功能模块要完成的功能和它具有的接口。测试用例对于功能代码的测试相当于黑盒测试,不用了解模块内部的实现,只管它是否满足需求。对于模块内部要完成的功能,一般不写测试用例。如要进行模块内部的测试可以通过开发工具的调试功能来完成。测试用例主要测试模块的功能。

2.1.3 编写功能代码

TDD的通常做法是测试代码未编写完成前是不写功能代码的,并且测试代码写完后是无法通过测试的。此时需要编写功能代码通过测试代码。值得注意的是,功能代码并不是越复杂越完善越好。最好的做法是所写的功能代码刚好通过所有测试用例。

编写完代码后要运行所有测试用例并保证全部通过。如果没有全部通过,就要对代码进行修改,直到通过所有测试。不应该在测试没有全部通过的情况下去编写其它代码。

2.1.4 重构

常有人质疑TDD开发方式所开发的软件质量。由于TDD在编写功能代码时只注重于快速完成代码并通过所有测试,并没有对代码的质量进行检验,所以这里面的代码质量无法得到保证。这样的质疑并不是没有道理。但是TDD的开发方式中也有比较重要的一个环节,重构。

在面向对象的开发方式中,几乎都会比较重视重构。它能提高代码的质量,利于以后对代码的修改和维护。采用TDD的开发方式也应该有重构。重构不应该修改与外部的接口而应该重点优化内部实现的代码。TDD有测试来验证重构后的代码不会影响外部接口。

在进行代码修改以后,要重新运行所有测试,并保证全部通过。重构不是一次就能完成的,可能会多次进行,并在以后对项目进行修改的时候进行。这一步常被很多开发者忽略,因为重构不增加新的功能,在运行时可能不会有明显的感觉。但对于提高代码质量非常有帮助。无论是否使用TDD都应该重视重构。

2.1.5 交付和部署

当程序代码编写完成,并通过各种测试以后,软件已经完成了客户需要的功能。由于TDD在开发过程中用测试用例代替了部分需求说明文档和规格文档,省去了前期需求变化的过程中修改文档的麻烦。在交付时可能需要补齐文档。

今后如果需要对软件进行修改,也只需要重复上述步骤。但也要保证所写的代码尽量简单,测试覆盖率要高,功能代码需要通过全部测试。

2.2 应对需求变化

敏捷软件开发是要能够快速应对需求变化的。TDD作为极限编程中倡导的软件开发方法也应该能够快速应对需求变化。

除了敏捷软件开发中要求的开发人员互相信任、经常面对面讨论等要求可以快速响应需求变化外。当使用TDD时,如果需求发生变化,则要设计和修改测试代码以反应需求的变化。当测试代码改变后,可以根据运行测试后的结果快速的发现哪些模块需要更改。只要修改代码使测试通过就可以了,而不用担心是不是又有其它地方出现了bug。TDD一个很大的好处也就是开发人员有明确的目标,代码可以马上进行测试并保证完成想要达到的功能,并通过测试覆盖率了解到是否有多余的代码。

2.3 工具

2.3.1 JUnit

JUnit是一个开源的测试框架,主要是用来对Java程序进行自动化单元测试的[4]。它能很好地集成在Eclipse中对代码进行测试。它的主要功能有对测试结果断言、共享测试数据、运行测试。

JUnit是xUnit中的一个,其它类似的还有NUnit用于测试.NET代码,CppUnit测试C++代码。

2.3.2 EasyMock

EasyMock是一个开源的生成Mock对象的工具,可以隔离测试对象与其它辅助的对象。它可以模拟出一个对象并记录它期望进行的行为和结果。在回放状态调用它以进行测试。还可以对Mock的对象进行验证。

3 结束语

本文介绍了测试驱动开发的一些特点和实现过程,并介绍了相关工具。通过与持续集成等其它敏捷软件开发工具和技术结合,可以较好地应对需求变化、及时发现问题并保证软件质量。

参考文献

[1]陈立群.测试驱动开发在J2EE项目中的全程实践[J].计算机工程与科学,2008,30(4):86-88.

[2]侯典荟.基于.NET环境测试驱动开发研究与应用[D].大连理工大学,2006.

[3]Janzen D S, Saiedian H. On the influence of test-driven development on software design[C]. Turtle Bay,HI,United states: Institute of Electrical and Electronics Engineers Inc,2006.

[4]白凯,崔冬华.基于JUnit自动化单元测试的研究[J].计算机与数字工程,2010,38(2):52-54,103.

转载请注明出处学文网 » 浅析测试驱动开发

学习

神奇的太阳帆

阅读(26)

太阳帆是什么帆?是不是像大海上的帆船一样靠风来航行呢?其实,太阳帆就是一种在太空飞行的航天器,即在飞船四周装上像风帆一样的帆板,靠太阳提供动力在太空飞行。大家知道,宇宙飞船上天需要携带足够的燃料,因为不管是遥远的星际旅行还是航天器

学习

浅析青岛海尔资本结构现状

阅读(20)

本文为您介绍浅析青岛海尔资本结构现状,内容包括青岛海尔盈利模式分析,青岛海尔集团最优负债率。【摘要】本文以青岛海尔2O07年至2O11年的财务报告数据为基础,计算和分析各种财务数据与指标,得出青岛海尔资本结构的情况:负债融资比重较同行

学习

面部皮炎患者123例斑贴试验分析

阅读(16)

[摘要]目的:回顾分析笔者科室123例面部皮炎患者斑贴试验结果,以明确常见致敏化妆品成分及所致疾病种类。方法:对笔者科室门诊以“面部皮炎”为表现的患者进行化妆品系列变应原斑贴试验(49种变应原),按国际接触性皮炎研究组推荐标准判读结果,并

学习

高中生物教材中有关下丘脑的功能概述

阅读(25)

本文为您介绍高中生物教材中有关下丘脑的功能概述,内容包括高中生物下丘脑的作用总结,总结下丘脑的功能高中生物。下丘脑是调节内脏活动和内分泌活动的较高级神经中枢,还有一些神经分泌细胞,既能传导神经冲动又有分泌激素的功能。因此功能

学习

《民法总则》关于诉讼时效规定

阅读(25)

本文为您介绍《民法总则》关于诉讼时效规定,内容包括保险法诉讼时效和民法总则冲突,人身损害最新诉讼时效民法总则。《民法总则》将普通短期诉讼时效期间规定为三年。此外,关于短期时效期间的起算、诉讼时效的客体、诉讼时效的终止等,《民

学习

50例直立倾斜试验结果的分析

阅读(18)

本文为您介绍50例直立倾斜试验结果的分析,内容包括直立倾斜试验结果分析,影响直立倾斜试验结果的因素。【摘要】目的探讨直立倾斜试验作为对反复发作不明原因晕厥患者的一种评估手段。为临床迷走神经性晕厥患者的诊断提供有效的依据。方

学习

享誉省港的安福火腿

阅读(20)

“诱人之香,夺席之味”坊间有一个类似脑筋急转弯的笑话,说海马不是马、鲍鱼不是鱼、企鹅不是鹅、熊猫不是猫,但是火腿真的是腿。火腿之“腿”就是一整条猪后腿,正宗的传统火腿是用绳束着猪脚,吊起一大块后腿肉,不管是悬在房前屋后,从任何角度都

学习

新时期“巴子”的20大特征

阅读(25)

“巴子”是上海俚语,过去专门指“农民”,后来发展到指称一切落伍的不领世面不合时宜不上档次的人,其中当然也有上海人。而这些人的行为,一个“巴”字就可以全面概括。对一个上海人说“侬这个人哪能介巴的啦”是要比骂他还严重的,因为身为一个

学习

顾维钧与巴黎和会

阅读(29)

本文为您介绍顾维钧与巴黎和会,内容包括巴黎和会顾维钧谁演的,顾维钧巴黎和会事件概括。作为民国时期著名的外交家,同时也是世界上著名的外交家之一的顾维钧,几乎参与了当时一切重要的外事活动。在巴黎和会上,他以流利的英语和精彩的演讲力

学习

浅析同性婚姻合法化

阅读(33)

本文为您介绍浅析同性婚姻合法化,内容包括同性婚姻合法化法理初探,同性婚姻合法化提案结果。【摘要】同性恋是指一个人在、心理、情感上的兴趣主要对象均为同性别的人,无论这样的兴趣是否从外显行为中表露出来。那些与同性产生爱情、或恋

学习

阿弓镇山歌光碟的传播现象分析

阅读(37)

富的民间歌曲正在如水土流失般渐渐淡出人们的视线,民歌的研究者和民歌的实践者们共同面临的紧迫任务是寻找一条行之有效的民歌传承路径。20世纪80年代以前,山歌是阿弓镇各族人民最重要的精神食粮,田间山野,随处可听到悠扬的山歌声。20世纪80

学习

观话剧《萨勒姆的女巫》

阅读(18)

本文为您介绍观话剧《萨勒姆的女巫》,内容包括萨勒姆的女巫话剧观后感,萨勒姆女巫话剧讲解。摘要:《萨勒姆的女巫》是美国着名剧作家阿瑟·米勒创作的重要剧作。本文先对本剧的主题做一简洁陈述。整部话剧好似一场游戏,起因非常简单,但

学习

足厥阴肝经

阅读(24)

本文为您介绍足厥阴肝经,内容包括足厥阴肝经详细介绍,足厥阴肝经穴位。十二经脉在人体的循环流注如同接力赛,经气从手少阴肺经的起始部――中焦脾胃出发,从一条经脉走向另一条经脉,环环相扣,足厥阴肝经就是其中的最后一道环节,它从足部接过足

学习

金刚烷――新一代化工原料

阅读(21)

本文为您介绍金刚烷――新一代化工原料,内容包括金刚烷原料市场规模,金刚烷化工原料。摘要:简要介绍了金刚烷的结构、性质、制备方法及应用。造成金刚烷收率低的原因:没有掌握提高金刚烷收率的关键,即发挥助催化剂的协同作用,有利于生成

学习

关于德化县第三中学校本课程开发与实施的研究

阅读(25)

【摘要】目前我国实行的是国家、地方、学校的三级课程管理模式,其中校本课程是至关重要的一环,这是因为校本课程具有更高的选择性和适应性,它能更好地满足学生个性化发展的需要,有力地促进教师的专业化成长,还能够彰显学校的办学特色,促进学校

学习

汽车驱动桥故障分析

阅读(21)

本文为您介绍汽车驱动桥故障分析,内容包括汽车驱动桥的常见故障分析,汽车驱动桥故障分析树状。新岭煤矿(原岭北露天矿)自2000年生产运输方式逐步由准轨铁路运输向汽车运输过渡,2004年汽车运输全部取代铁路运输,担负新岭煤矿煤、岩运输任务

学习

测试测量等

阅读(30)

本文为您介绍测试测量等,内容包括测试和测量,工程测量第一章。安捷伦科技推出针对通用示波器的硬件模板极限测试解决方案安捷伦科技日前宣布推出业内首款针对通用示波器的硬件模板极限测试应用软件。这款应用软件能够稳定保持每秒高达89

学习

联想昭阳K29、ThinkPad X230对比测试 同族搏杀

阅读(180)

本文为您介绍联想昭阳K29、ThinkPad X230对比测试 同族搏杀,内容包括联想thinkpadx395跟x280的区别,联想昭阳k27和x230。在昭阳和ThinkPad分属两家企业的时候,它们有着相互重叠的用户群及销售渠道,但是随着近1年来联想对这两个品牌的整合,

学习

起重机金属结构应力测试

阅读(30)

本文为您介绍起重机金属结构应力测试,内容包括塔式起重机应力检测,起重机自重应力什么意思。由于使用年限长、使用频繁、作业环境恶劣等原因,起重机金属结构容易受磨损及腐蚀而发生变形,导致刚度和强度也跟着变小,此时必须采取一定的措施来

学习

中国油气田开发现状、面临的挑战和技术发展方向

阅读(37)

本文为您介绍中国油气田开发现状、面临的挑战和技术发展方向,内容包括油气田开发进展,油气田开发发展趋势。随着我国经济的不断发展,人民生活水平的提高,石油的供应大大增加。石油是工业的血脉,也是工业建设必不可少的能源之一。假设一个国

学习

中国海洋资源开发与海洋综合管理研究

阅读(37)

本文为您介绍中国海洋资源开发与海洋综合管理研究,内容包括海洋资源与海洋生态保护论文,中国海洋开发与管理杂志。DOI:10.16660/ki.1674-098X.2016.22.120随着经济发展水平的逐步提高,人口数量的增长使得陆地上的资源不断锐减,生态环境遭到

学习

浅谈语言测试效度

阅读(26)

本文为您介绍浅谈语言测试效度,内容包括语言测试的可靠性,语言测试学发展史。测试效度是语言测试学领域至关重要的概念之一,也是众多语言学家科研的重点。它是测试质量审定的主要依据,直接关系到测试质量的高低。因此有必要对语言测试的效