1、测试驱动开发
生产高质量产品的软件开发过程对于软件的质量和软件开发人员来说是非常重要的,一方面要开发高质量的软件产品,另一方面还要兼顾软件开发的成本、人员的效率及合理的开发进度,在软件开发方法中,极限编程提供了一个新的思想。
极限编程(eXtremeProgramming,XP)是KentBeck倡导的一种新型软件开发方法,它是一个周密而严谨的软件开发流程。它基于简单、交流、反馈、勇气的原则,在充分考虑到人的因素的前提下进行,达到客户的最大满意度。
测试驱动开发是XP编程思想的一种主要实践,可以有效地让程序开发人员开发出更高品质的、经过完整测试的程序。测试驱动开发(Test-DrivenDevelopment,TDD)是极限编程的最佳实践之一,是开发方法中的基石,也是对传统编程开发方法最不一样的地方之一。
它的基本思想就是在开发功能代码之前,先编写测试代码。也就是说在明确要开发某个功能时,首先思考如何对这个功能进行测试,并完成测试代码的编写,然后编写相关的代码满足这些测试用例。之后循环进行添加其他功能,直到完成全部功能的开发。
测试驱动开发主要包括两方面:测试先行和代码重构。测试主要针对单元(最小的可测试软件元素)实施测试。它所测试的内容包括内部结构(如逻辑和数据流)以及单元的功能和可以观测的行为。测试先行一改传统开发模式中的单元测试在编写代码之后进行,而将单元测试的编写移到编写正式代码之前。
重构是在不改变代码外在行为的条件下改进其内部的行为的一种软件系统改变的过程,使代码松耦合并且内聚度高。这种方法在实际中能够起到非常好的效果,使得测试工作成为设计的一部分,很好地把开发和测试融合为一个整体。
2、优点
测试驱动开发的想路就是要通过测试来推动整个开发的进行。而测试驱动开发方法并不只是单纯的测试工作,它会直接或间接地将开发人员的信心和开发进度关联起来,对于软件开发团体来说,开发、测试是可以互相促进的,由于软件产品说明书可以说是经常改动,因此可能需要团体经常在一起进行讨论,通过沟通来统一一些观点,而测试和开发工作的并行为沟通提供了桥梁,所以测试不仅仅是测试设计员设计的测试用例和测试员执行测试的过程,更是与软件开发团体互相沟通、互相研究、互相促进的过程。根据测试驱动开发的实践,测试驱
动开发的思想至少可归纳为以下几个优点:
(1)项目进度可预测,而传统的方式很难知道编码何时结束。
(2)大部分时间代码处在高质量状态,100%的时间里成果是可见的。
(3)从软件开发的初始阶段,测试驱动就强迫开发人员以测试的角度与用户的观点对软件进行审视,因而更能够对软件有全面的认识和把握。为系统改进提供了很好的保障。
(4)由于可以保证编写测试和编写代码的是相同的程序员,降低了理解代码所花费的成本。
(5)对于一个敏捷的开发小组,每个人都在做设计,对改善设计有很大助益。
(6)减轻了测试的工作量。无论是否进行设计工作,测试工作都是不可避免的,先进行单元测试,可以减少后续的测试工作量。
(7)让程序员能够更大程度地控制代码的正确度,相当于提供了两道的代码审核手段,在软件成品的质量上提供了一定的保障。
(8)显著增加开发者的信心并赢得他人的信任。
(9)为功能代码提供了很好的“文档”。
(10)在一定程度上可以代替程序调试的工作。
3、过程
测试驱动开发的基本过程如下:
(1)明确当前要完成的功能。可以记录成一个TODO列表。
(2)快速完成针对此功能的测试用例编写。
(3)测试代码编译不通过,新增的测试用例很可能编译不通过。
(4)编写对应的功能代码。
(5)测试通过。
(6)对代码进行重构,并保证测试通过。
(7)循环完成所有功能的开发。
测试驱动开发也是单元测试,单元测试是通过测试定义所要开发的功能的接口,然后实现功能的开发过程。开发人员开发过程中要做不同的工作,比如:根据测试用例编写测试代码、开发相应功能代码、对代码进行重构等。
做不同的事,承担不同的角色。开发人员完成对应的工作时应该保持注意力集中在当前工作上,而不要过多的考虑其他方面的细节。避免考虑无关细节过多,无谓地增加复杂度。同时,在做测试计划时,应该考虑到软件产品需要测试的功能点很多。
在任何阶段如果想添加功能需求问题时,应先把相关功能点加到测试列表中,然后继续手头工作。循环不断地完成对应的测试用例、功能代码、重构。一是避免疏漏,也避免干扰当前进行的工作。在单元测试中,对照软件产品说明书或详细设计,检查某个功能,某个类,首先编写测试代码,考虑其如何使用、如何测试。再对其进行设计、编码。
4、实现
NUnit是一个单元测试框架,专门针对于.NET来写的,它和JUnit(Java),DUnit(Delphi),CPPUnit(C++)一样都是xUnit的一员。NUnit是xUnit家族种的第4个主打产品,完全由C#语言来编写,
并且编写时充分利用了许多.NET的特性,比如反射,客户属性等等。最重要的一点是它适合于所有.NET语言。
5、结语
随着WindowsXP开发方法的风行,测试驱动开发单元测试的思想也在遍地开花。越来越多的开发人员和公司开始学习和接受这种思想,并且在日常的开发工作中进行一些尝试,取得了很好的效果,但也存在一些不足,测试驱动开发是单元性测试,不是全局性测试。
因此在对模型的验证方面起不到关键作用;如果用测试驱动开发驱动图形用户界面的编写,容易造成资源浪费;测试驱动开发的应用领域问题。对于设计很重要必须提前做好的软件,对于软件质量要求极高的军事或科研产品如神州六号,对于人命关天的软件如医疗设备软件等等不适合用测试驱动开发。
测试驱动开发是一个很有影响的研究方向,它能够提高代码的质量,帮助设计出可重用和可测试性的代码。积极有效地使用测试驱动开发是软件开发的好的方向。