Spring框架技术在软件自动化测试中的应用
2011-03-16蔡昱星
蔡昱星
(南京邮电大学 南京 210003)
0 引言
随着我国信息化建设的不断推进和整个软件产业的不断发展,国内的软件行业也从最初的简单模仿到现在的自主创新以及核心技术的研究,从最初的简简单单的几千行代码的小项目到现在几十万甚至几百万行代码的产品级软件项目,如基础软件、高端产品等,而这一级别的软件产品从其前期的设计到中间的开发、测试到最后的推向市场都要经历一系列严格的制作工序才能保证其产品的稳定性,以及可扩展性。而测试作为保证软件可靠性的重要环节正在得到越来越多的重视。所以提高测试效率,优化测试效果就成了当务之急。
1 自动化测试框架概述
1.1 总体系统介绍
图1 自动化测试系统整体结构
自动化测试系统主要由资源层,执行引擎层和数据库层3层构成,如图1所示,可以看出该自动化测试框架的核心也就是其开发语言、库程序、驱动程序等一系列技术及工具,同时这些资源也处于MVC架构中最核心的控制层,而无论是对测试环境的自动安装与配置,测试用例的管理,以及测试结果的自动化分析与存储,这些都是由这一处于控制层的核心对它们进行调用和处理,而框架的展现层则负责展现诸如测试用例,以及测试分析的结果,而其实体层则负责对该框架所涉及到的一系列有用的数据进行存储,同时方便核心控制层对它的调用。
1.2 详细实现
图2 原有自动化测试系统详细架构体系
没有应用Spring技术的自动化测试框架详细实现如图2所示,可以看到该自动化测试框架主要是的设计也体现了MVC的架构思想,由jsp和servlet去实现view层,TestcaseManager去实现control层,而由TestcaseResource去实现数据持久层使用,MVC架构的优点是显而易见的,首先,最重要的是应该有多个视图对应一个模型的能力。在目前用户需求的快速变化下,可能有多种方式访问应用的要求。其次,由于模型返回的数据不带任何显示格式,因而这些模型也可直接应用于接口的使用。再次,由于一个应用被分离为3层,因此有时改变其中的一层就能满足应用的改变。一个应用的业务流程或者业务规则的改变只需改动MVC的模型层。 控制层的概念也很有效,由于它把不同的模型和不同的视图组合在一起完成不同的请求,因此,控制层可以说是包含了用户请求权限的概念。 最后,它还有利于软件工程化管理。由于不同的层各司其职,每一层不同的应用具有某些相同的特征,有利于通过工程化、工具化产生管理程序代码。
但是,众所周知,虽然自动化测试确实是好处有很多,但是在很多项目中或者很多公司中却还是得不到广泛的应用,其中的主要原因就是因为测试框架本身的可复用性,可扩展性得不到充分的保障,那么如何解决这个框架的脆弱性呢,如何使其变得更加健壮,使其在面对目标项目的功能变更的时候能够以极小的框架变更高效率的与目标项目实现功能映射,如何在目标项目如支持多平台的情况下不至于需要重新再编一套自动化测试框架,而运用原有的测试框架就能应对自如呢?
2 Spring在软件自动化测试中的研究
2.1 Spring简介
Spring框架是一个分层架构,由7个定义良好的模块组成。Spring模块构建在核心容器上,核心容器定义了创建,配置和管理bean的方式,同时Spring框架是一个轻量级的Jave EE框架。它主要有以下几个特点:
(1) 非侵入式:所谓非侵入式是指Spring框架的API不会在业务逻辑上出现,也就是说我们的业务逻辑应该是纯净的,不能出现与业务逻辑无关的代码。首先针对应用而言,这样我们才能将业务逻辑从当前应用中剥离出来,从而在其他的应用中实现复用;其次针对框架而言,由于业务逻辑中没有Spring的API,所以业务逻辑也可以从Spring框架快速的移植到其他框架。
(2)容器:Spring提供容器功能,容器可以管理对象的生命周期,对象与对象之间的依赖关系。用户可以写一个配置文件(通常是XML文件),在上面定义对象的名字,是否是单例,以及配置与其他对象的依赖关系。那么在容器启动之后,这些对象就像被实力化好了,直接去用就好了,而且依赖关系也建立好了。
(3)IOC:控制反转,它的核心思想就是要面向接口编程,即极大地降低了对象之间的耦合度。
(4)依赖注入:建立对象与对象之间依赖关系的实现,包括接口注入、构造注入、set注入,在Spring中只支持后两种。
(5)AOP:面向方面编程,可以把日志、安全、事务管理等服务(或功能)理解成一个“方面”,那么以前这些服务一直是直接写在业务逻辑的代码当中的,这有两个缺点:首先业务逻辑不纯净,其次这些服务被很多业务逻辑反复使用,完全可以剥离出来做到复用。那么AOP就是这些问题的解决方案,可以把这些服务剥离出来形成一个“方面”,以期做到复用;然后将“方面”动态的插入到业务逻辑中让业务逻辑能够享受到此“方面”的服务。
2.2 应用设计
在测试框架中运用Spring其实主要是为了保持代码良好的封装性,层次的清晰性,以及对未来需求变更的良好复用性,这些都能够通过Spring来达到,就像前面看到的MVC架构,其实仅仅靠servlet,jsp,hibernate等自身其实很难达到真正的MVC结构,比如在展现层也需要处理一些业务逻辑以决定各种不同的展现,数据库持久层其实也担任了具体持久类如结果日志等的存储工作,这些设计使得整体的架构不是那么的清晰,现在引入Spring就能解决这些问题:
(a)在持久层中再抽象出一个DAO层专门作为持久化的逻辑设计,Spring的applicationContext.xml文件配置如下:
在这里可以看到如何与数据库连接,和哪个数据库连接,都交由Spring帮你实现,最重要的,可以看到这里面有个负责存储的storeDaoImpl类,它负责所有的数据存储工作,将model层解放出来只需要处理如何设计持久化类,分层的思想得到了很好的体现。
(b)在核心控制层加入Spring的AOP机制,使得代码的封装性和可扩展性得到很大的提升,众所周知,在自动化测试里面最重要的就是测试场景的模拟,而这些也是最耗费测试人员体力和机器资源的,如有些场景很多测试case都要用到,有些只有一部分才会用到,而有些只有个别的case才会用到,且每个case必然也会需要自己独特的测试场景。如果逐一对待的话不但工作量极大,容易出错,而且代码很容易写死,这样如果以后某部分功能有变更的话那么对测试框架的更改的工作量是惊人的,但是如果我们用Spring对这些场景的创建过程进行管理,那么上面的诸多问题便迎刃而解:
3 性能分析
在实际的BPS(business process suite)项目中的试验发现,通过在测试框架中引入Spring特性,使得整个测试系统的代码很轻易的就实现了代码的复用,同时由于Spring的原则是非侵入式的,就是实际业务逻辑代码中感觉不到Spring框架的存在,通过Spring本身的IOC功能,Spring只是起到了一个实例产生的作用,然后把实例分配给需要的对象,这样更容易实现松耦合和良好的封装性,为系统提供了更好的层次性和代码的可读性,而且也符合Java一贯提倡的面向接口编程。然后通过在框架中利用Spring动态的生成一个DAO层,使得将于数据库的交互逻辑得以动态进行控制,而不至于将其存储逻辑僵化的封装于model层,这为以后项目功能的更改而导致的测试业务逻辑的更改提供了极大的便利。同时通过应用Spring的AOP功能,将可能需要进行频繁更改的测试业务通过AOP机制单独提取出来,这样就可以在测试系统需要重用的时候轻轻松松的把业务逻辑从整个系统中抽象出来再无需任何修改的情况下用到其他系统中去,如测试环境的配置,测试数据的清理,测试日志以及测试细节的记录等。加入Spring后的架构体系如图3所示。
可以看到,现在的自动化测试框架分层更加清楚,这使得框架的健壮性得到了很好的保证,而由于AOP和DAO的应用使得框架能共轻松地应对来自目标项目上功能的变更,如无论自己现在想加入何种功能都可以通过OwnLogic层进行更改,同时由于Spring本身对降低代码耦合度这方面的卓越表现,使得不会出现牵一发而动全身这一灾难性后果,而这一特性对于一个需要不停应对功能变更的自动化测试框架来说尤为重要,最后,通过DAO层的引入,使得框架在面对多平台测试的时候也游刃有余,因为重新抽象出来的DAO层专职负责与数据库的交互逻辑,这使得其他架构层不需要关心现在是在什么平台上做的测试,这样就解决了测试框架在多平台上的应用。具体性能比较如表1所示。
图3 运用spring技术后的自动化测试架构体系
表1 改进后的自动化测试框架与原有的测试框架比较
改进后的测试框架运行结果截图:如图4所示。
通过测试结果可以看到我可以很简单对某一模块进行自己想要的测试,如图4结果显示的junit单元测试,即我们现在可以很轻松地对框架实现功能的变更。
4 结束语
随着软件行业的发展,软件测试技术,特别是自动化测试技术越来越受到业内人士的重视,而如何有效地开展自动化测试也成了个软件企业探索的一个总要方向,本文通过在自动化测试系统中引入Spring框架技术,使得系统的开发效率和质量都大大得到提升,通过在对实际项目的实验可以发现,由于Spring本身对代码良好的封装性,在以后产品功能变更的时候极大的降低了框架的修改复杂度,使得自动化测试系统的寿命得以延长,且Spring不但应用于普通软件产品的开发,其通过对测试的辅助也可以达到增强整个软件产品稳定性和高效性的作用。最重要的是引入了Spring的自动化测试框架其本身也达到了软件系统所要求的代码的良好的封装以及松耦合等特性,这使得系统在应对未来的功能上的更改甚至于其他项目上都能发挥其作用,这能大大降低公司的人力资源成本和无用的功能重复开发。
[1] 计文柯.Spring技术内幕-深入解析Spring结构与设计原理[M].北京:机械工业出版社,2010.
[2] 刘京华.java web整合开发王者归来[M].北京:清华大学出版社,2010.
[3] 陈能技. 软件自动化测试成功之道:典型工具、脚本开发、测试框架和项目实战[M].北京:人民邮电出版社,2010.
[4] 王东刚.软件测试与junit实践[M].北京:人民邮电出版社,2004.
[5] 刘双悦.王培东.一种基于改进遗传算法的面向路径测试用例自动生成方法[J]. 自动化技术与应用, 2010(03).
[6] 王小银. 软件自动化测试的研究与实现[J]. 电脑知识与技术, 2010(25).
[7] 谢经纬. 吴昊. 探索性方法在面向故障软件测试中的应用[J]. 微计算机信息, 2010(25).
[8] Seth Ladd .深入解析Spring MVC与Web Flow [M].北京:人民邮电出版社, 2008.