面向对象的自动化单元测试框架设计与实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
面向对象的自动化单元测试框架设计与实现
摘要:以面向对象自动化单元测试的设计目标为指导,结合面向对象自动化单元测试理论分析,采用Kent Beck和Ralph Johnson提出的模式产生体系结构方式架构框架系统。
运用模式设计体系结构的思想,设计了一个用于面向对象软件单元测试的自动化测试框架。
该测试框架易学好用,能方便程序员开发测试用例,保证测试用例的持久性和可复用性,适合迭代开发单元测试。
关键词:软件工程;软件质量;单元测试;测试框架;面向对向程序
0 引言
随着现代软件工程的不断发展,人们对软件质量和生产力的要求越来越高。
软件测试技术和框架复用技术作为提高软件质量和生产力的有效手段,近年来倍受人们的重视。
传统的“黑盒”、“白盒”测试技术主要应用于面向过程的程序设计中。
随着面向对象技术的发展,这种技术已不能满足软件测试的需要。
自动化单元测试框架应用于面向对象单元测试中,通过它来实现单元测试自动化。
单元测试是对软件进行正确性检验的测试工作,是软件设计的最小单位。
单元测试的目的主要是发现每个程序模块内部可能存在的错误。
程序员的基本职责是单元测试,单元测试能力是程序员基本能力的体现,程序员必须对自己所编写的代码认真负责,软件的质量与程
序员的工作效率直接受程序员单元测试能力高低的影响。
单元测试是一项很重要而且必要的工作。
在实际工作中,许多程序员并不愿意对自己编写的代码进行测试。
软件开发的工作压力大,大多数程序员们因为没有时间测试自己的代码,使程序的代码质量得不到保证,有些代码还需重新编写,程序员根本没有时间对代码进行测试。
自动化单元测试框架能够从根本上解决这个问题,它可以使测试工作变得简单,这样更有助于程序员进行代码开发工作。
1 自动化单元测试框架设计目标
自动化单元测试框架的设计应达到以下目标:首先,框架简单,可以使测试程序的编写更简化。
框架使用常见的工具设计,测试工作操作简单;其次,测试框架应能够使除作者以外的其他程序员进行代码测试,并能解释其结果,即将不同程序员的测试结合起来,且不发生相互冲突。
最后,测试用例可以复用,可以以现有的测试为起点形成新的测试。
本文将以这些目标为指导,讨论如何用以Kent Beck和Ralph Johnson提出的“模式产生体系结构”的方式来设计框架系统。
自动化单元测试框架的设计思想是从0开始根据设计问题应用设计模式,一个接一个逐步设计,直至获得最终合适的系统架构。
其中实现部分采用Java语言来实现,并会使用UML图来表示各种类及类间关系。
2 面向对象自动化单元测试分析
自动化测试定义为:管理与实施各种测试活动,包括开发测试脚本、执行测试脚本,这样使验证测试需求更加方便,通过这些脚本实
现了自动测试,可以把它称为自动测量工具。
使用这种自动测试工具对增量软件集成测试提供了巨大的方便,增加了巨大的价值。
每一个新的构件可以重用先前开发的测试脚本,即使需求和软件有变更,作为一个重要的控制机制,自动测试也能够确保每一次重新构建的稳定性与准确性。
3 面向对象自动化单元测试框架
自动化测试框架实质是一种自动测试工具,单元测试的核心问题是实现测试自动化。
一个完整的自动化测试过程通常包括5个测试活动,分别是测试标识、测试设计、测试实现、测试执行与评估。
测试用例针对被测试系统的各项功能准确地开发与设计,而且每一个测试用例都要按顺序执行这5个测试开发活动,测试开发活动如图1所示。
图1 测试活动
测试标识与测试设计这两个测试活动主要为智力活动,分别标识测试条件和设计测试用例。
测试执行与测试比较这两个活动属于比较机械的活动,它们的功能分别为:执行测试用例、将测试输出结果并与期望输出结果值相比较。
前两个活动决定了测试用例的质量,后两个活动适合自动化。
在单元测试中,测试执行和测试比较这两个活动要重复多次,测试标识与测试设计通常只执行一次。
因此,在单元测试过程中,重复性的活动特别需要自动化执行。
4 自动化单元测试设计与实现
首先构建对象来表达基本概念:Test Case(测试用例),然后将对象发送到测试框架,再由测试框架执行,最后报告测试结果。
采用Command命令模式将一个请求封装成一个对象,Command 模式可以为每一个操作生成一个与之对应的对象,同时能够给出一个对应的执行方法。
这样可以对多个用户请求进行排队,也可以将多个请求记录到日志,并使用不同的请求对客户进行参数化。
具体实现方法如下:
其中的run()方法为模式中的执行方法,可以通过继承来重用该类,为了便于在测试失败时能够识别出失败的测试,每一个Test Case在创建时都要给出与之对应的名称,这样即可判断出失败的测试。
图1展示了测试框架组成部分的快照,也展示了应用于TestCase 中的标记。
图1 测试框架组成部分
5 单元测试用例执行流程
在实际测试过程中,构造参数或资源、测试、释放资源为测试的业务逻辑过程。
例如,在测试数据库的插入、更新、删除、查询等操作时,首先要对数据库进行连接,然后测试,最后释放连接。
这样,在一个Test Case中有多个测试,需要反复书写代码,这增加了测试人员的工作量,不符合设计目标。
建立测试支架即为所有的测试建立一个共同的结构,可以解决以上问题,初始化代码、测试代码和释放资源的代码均放在测试支架上,每次运行测试代码之前,首先都运行初始化代码,最后运行释放资源代码。
这样,每一个测试都会和与之对应的支架一起运行,而且测试
结果互不影响,每一个结果都不会影响其它的测试结果。
这样便实现了代码的复用,大大提高了软件单元测试的工作效率。
以上通过模板方法实现,模板方法的Template Method静态结构如图3所示。
其中,setUp方法初始化测试信息,如数据库的连接,cleanUp 方法的功能是测试结束后释放资源。
runTest方法的功能是进行测试业务逻辑。
TestCase的方法的功能为进行测试逻辑框架的设计,run 为模板方法。
在这里,setUp和cleanUp可以被用来重写,由框架来进行调用。
6 测试结果收集
创建对象TestResult来收集运行的测试结果,实现代码如下:
UTF使软件开发者们更愿意接受测试代码的工作。
有种种好处:UIT使测试用例的实现简单、一致且模块化;测试实现与执行的特性支持迭代、增量开发;重新运行测试包的便利使高频率的回归测试成为可能;同时它还能保证单元测试的持久性。
此外,单元测试框架UTF也是可扩展的,例如,利用Decorator模式,可以不断向UTF添加新的功能;TestResult类也是框架的一个扩展点。
客户能够自定义它们的TestResult类,例如,HTMLTestResult可将结果上报为一个HTML文档等。
参考文献参考文献:
[1] (美)普雷斯曼.软件工程:实践者的研究方法[M].北京:机械工业出版社,2011.
[2] (美)麦格雷戈.面向对象的软件测试[M].北京:机械工业出版社,2002.
[3] 刘中兵Java研究室.Java Web核心框架[M].北京:电子工业出版社,2009.
[4] 刘伟.设计模式的艺术——软件开发人员内功修炼之道[M].北京:清华大学出版社,2013.。