在过去几十年中,自动化测试已经有了良好的发展。最初的测试工具只提供了简单的捕捉/回放功能:记录键盘和鼠标的操作,并捕捉屏幕,然后通过播放所记录的操作进行验证。这样的脚本很难维护,从而要求开发功能和灵活性更强的测试工具,并能将这些工具很好地整合起来,使整个自动化测试过程的各个部分或各个阶段能很好地衔接起来。这就需要构造一个完整的自动化体系,形成自动化测试的流水线,使整个测试过程一气呵成。这其中,不仅要包括自动化测试的执行,还要包括自动化测试脚本的开发、软件包自动部署以及测试报告自动生成等,才能将自动化开发、执行和日常工作融合在一起。这一切都需依赖于自动化测试架构。
针对上述讨论,我们深知自动化测试所面临的挑战。面对挑战,必须采取以下这些相应的对策,通过构建适应性很强的自动化测试框架来解决一系列问题。
1) 需求频繁的变化要求自动化测试具有一个灵活的适应机制。 我们知道,建造商品住房时,如果只浇灌混凝土框架,没有砌墙,那么住户就有更大的灵活性来设计自己的家,可以满足住户更多的个人需求。在某些商场、写字楼的建筑上,这种考虑表现得更为充分,保留了很大的灵活空间供商家租用和装修。
2) 单元测试、集成测试和系统测试等的自动化实施能共享某些平台和 机制,让这些测试有机地结合起来。 例如,房屋的各个功能模块,包括卧室、会客厅、厨房、卫生间、窗户、屋顶等都要有框架支撑,才能形成实用的、功能完整的住宅。
3) 大规模软件团队的协作和硬件资源的使用效率都要求一个良好的 基础设施来支撑自动化测试。 例如,房屋的各个单元之间需要通过布置电线、水管、暖气管、有线电视等网络,才能有机地结合起来,更好地支撑各个功能之间的协调和使用,更好地为住宅的主人服务。
从上面这些举例可以得知,自动化测试也不例外,在进行具体的单元自动化测试、功能自动化测试和系统自动化测试之前,先要建立一个清晰的框架,才能包容自动化测试的各个功能单元,使将来各项自动化测试任务有机地结合起来,顺利地开展工作。
作为自动化测试框架,最根本的是要构造一个良好的工作空间,能够容纳各种类型测试工具的执行,以使这些工具能够相互兼容,共享测试数据。如果能够像Windows操作系统那样支持即插即用,任何测试工具都可以动态、方便地加入系统或从系统中移除,则再好不过。
其次,自动化测试框架需要能够监控测试执行的过程,包括监控测试对象资源(如CPU、内存等)的使用,及时收集来自不同测试工具的测试结果,并将这些结果进行归类和分析,生成相应的测试报告,通过邮件和网站等发布出去。
再者,为了让测试能够在某个特定时刻(例如晚上)自动执行,自动化测试框架应具有事先安排(schedule)任务能力,并能够支持维护测试环境和管理测试资源,包括管理硬件资源列表、支持测试状态查询和自动分发测试任务到相应的测试机器上,并在规定的时间内完成测试任务。
最后,自动化测试框架还应能支持自动化测试的前期任务,支持测试脚本的录制、编辑和调试,支持测试脚本的快速开发和良好的维护性,而且能够支持测试用例、测试套件(test suite)和其他测试活动的管理。
要构建良好的自动化测试框架,还需要提供一些基础设施来支持自动化测试,例如邮件服务、跨平台的通信服务、分布式开发和运行环境等,如图2-7所示,一个良好的自动化测试框架应具有下列能力。
1) 提供非常有效的测试工作流程模型,如对任务安排、执行、通知结果和生成报告等完整的过程支持。
2) 支持多种脚本语言的录制、编辑、调试和回放等集成开发环境。
3) 完成各类测试任务的执行。
4) 有良好的扩充能力,如和第三方插件、工具的集成。
5) 具有数据驱动、关键字驱动等脚本模式的支持。
6) 具有分布式处理、远程调用等不同的运行方式。
7) 能获取测试覆盖率。
图2-7 自动化测试框架要解决的问题
如果进一步抽象,自动化测试框架就是用来解决自动化测试中的公共问题的,包括公用的对象、公用的方法、公用的环境或数据等自动化测试框架的要素。
1) 公用的对象 。不同的测试用例会有一些相同的对象(如窗口、按钮、菜单等)被重复使用,而这些公用的对象可以被抽取出来,在编写脚本时随时调用。如果需求发生变化,只需要修改这些公用对象的属性即可,而不需要修改太多的测试脚本。而要做到这一点,就要求我们构建对象库,并建立实体对象和逻辑对象之间的映射。
2) 公用的方法 。公用的方法比较多,相当于脚本的基础函数,可以构成基础函数库,供上层脚本调用。
3) 公用的环境或数据 。许多测试用例会在相同的测试环境上运行或使用相同的测试数据,可将不同的测试环境或数据封装起来,和测试用例进行灵活的组合,以增强脚本执行的灵活性,并覆盖更广的测试范围,降低测试风险。
自动化测试框架应支持脚本录制、脚本开发、测试用例和测试套件的创建和执行、远程控制、分布式通信等功能,才能基本满足测试自动化的需要。自动化测试框架还需要支持单元测试并与开发环境集成,如将集成开发环境Eclipse、软件配置管理工具CVS/SubVersion和软件包构建工具Ant/Maven等集成到这个框架中,以支持每日构建和自动验证测试。
如果自动化测试框架能管理测试项目、安排任务,将产品用户需求和测试需求很好地结合起来,那么测试目标更明确,测试的效率会得到进一步提高。测试结果的分析也是很重要的,一般要求在自动化测试框架中得到解决。最重要的是易用,将各个工具集成起来,并能使这些工具更好地发挥作用。例如,openqa.org社区提供了一个工具Bromine,它集成了Selenium Core/RC,非常容易跟踪和管理测试项目、需求、测试计划、测试用例和缺陷,可以监控缺陷的提交,将缺陷分派给相应的开发人员来浏览和分析测试结果。
一个理想的自动化测试框架能解决上述问题,提供一个分布式的通信平台、友好的人机交互界面和开放式架构,将自动化测试中所需要的各个关键部分有机地集成起来,形成一个为自动化测试服务的、完整的、层次清楚的开发平台和运行环境,如图2-8所示,其中各主要部分的功能如下。
图2-8 自动化测试框架示意图
1) 综合管理平台: 可以将自动化测试中所有的工作内容管理起来,相当于一个统一的入口(Portal),可以浏览每部分的内容。
2) 基于业务驱动的脚本集成开发环境: 可便于构造关键字驱动的脚本,为此要建立软件系统的对象库,并将这些对象映射为脚本中的逻辑对象,以减少软件需求变化对脚本的影响。这个集成开发环境还包括脚本录制、编辑等功能,并能和CVS、Ant等工具集成。其中库函数可以看做是关键字列表和关键字实现,而对象映射可以看做是由对象库和映射关系构成的。
3) 安排(Schedule)测试任务: 使任务可以定时启动,自带执行测试任务。
4) 监控测试资源: 在测试过程中,能够及时发现问题,发出警告,并保留(记录)相关数据。
5) 控制中心(控制器): 驱动测试工具,可以调用测试任务,并将测试任务、测试脚本等分发给远程机器。
6) 远程机器执行测试任务: 通过代理实现,而代理由控制中心来控制。
框架(Framework)是为开发者定制的应用骨架或应用的体系结构,着重从系统的可重用性进行设计,用来确定系统各个部分的作用、分工及其依赖关系、上下文(Context)关系或控制流程。应用框架更注重于面向专业领域的软件重用,提供这一应用领域所需要的基础服务,以缩短大型应用软件系统的开发周期,提高开发质量。应用框架还强调系统的可扩充性,使系统具有很好的适应性,很容易将一些功能强大的第三方组件集成到系统中来,共享基础设施和基础服务。
前面多次用到的Eclipse IDE,就是一个很好的软件开发框架,Eclipse具有良好的层次性,如图2-9所示。Eclipse覆盖整个生命周期,提供统一的界面来处理各项任务,并具有简单的接口,容易和第三方组件进行集成,一个新的插件很容易被载入到Eclipse系统中。
图2-9 Eclipse框架的层次性示意图
如果再看远一点,在Java软件开发中就有很多框架,例如Struts、Spring和Hibernate等,它们都遵循模型-视图-控制(MVC)设计模式,将商业逻辑和描述分开,由一个逻辑流控制器协调来自客户端的请求和服务器所提供的各种服务。这些框架提供了实现不同功能的技术和应用接口,而具体的实现则由开发人员来完成,一些特定的参数、表现可以通过XML配置文件、Java属性文件等辅助完成。如图2-10所示,Struts采用了Servlet、JSP和自定义的标记库等技术,构造了一个简单而清晰的MVC框架,从而极大地加快了开发的速度,并能适应需求的变化,改善软件系统的可维护性。
图2-10 J2EE的Struts框架的架构示意图
软件自动化测试框架虽然不完全等同于软件开发框架,但有很大相似性。因为自动化测试也包含了大量的(脚本)开发工作,包括脚本调试和版本控制管理等。例如,自动化测试也应该将业务逻辑和具体操作分开,从而形成关键字驱动脚本技术。在构造自动化测试框架的时候,底层需要有一个良好的通信机制,使各个组件之间实现消息传递,并提供标准的接口,从而使自动化框架具有良好的兼容性,容易将第三方工具集成进来。
所谓自动化测试框架,可以解释为自动化测试的整体解决方案,是由一些假设、概念和为自动化测试提供支持的系统及其最佳实践等构成的集合。对不同的应用领域或不同的测试水平,自动化测试的框架具有不同的构成,但我们必须清楚如何满足自动化测试的基本要求,了解自动化测试框架的基本构成,从而在此基础上,根据自己组织的实际情况来进行扩充,从而构造适应性更强、效率更高、功能更强的自动化测试框架。
为了能开展自动化测试的工作,首先需要基础设施(infrastructure)来支撑测试工具的运行,这包括Web服务器、邮件服务器、FTP服务器等。其次是执行自动化测试,要有一套机制来保证测试脚本的执行。具体地说,就是先建立测试环境,创建和执行测试套件,然后获取执行状态并给出测试结果报告。根据这个分析,可以描述一个自动化测试框架的雏形,如图2-11所示。
图2-11 软件自动化测试框架的雏形
图2-11中的雏形给出了自动化测试框架的基本构成要素,包括执行器、脚本管理器、报告生成器等,也比较清楚地描述了这些要素之间的关系。但是,这个框架还没给出其他一些必要的信息,例如:
●测试脚本的层次性,如何分离业务逻辑和系统基本操作?
●如何实现自动化测试工具的接口?
●如何实现被测试系统的对象映射?
●如何事先安排测试任务?
●如何管理有效测试资源?
如果要在测试脚本上分离业务逻辑和系统基本操作,必须将各种基本操作封装为特定的关键字,每个关键字对应一个函数,而业务逻辑可以由关键字和参数来描述,即可以通过图2-12来描述这种脚本结构。
图2-12 关键字驱动脚本框架示意图
事先安排测试任务,也是非常重要的。例如,测试人员在下班前将测试任务安排好,测试实际执行可以在晚上9点钟以后或得到新的软件包后自动开始。这样,测试人员在第二天上班前就可以得到测试报告。安排完任务,还需要开发具有相应触发机制的引擎(Engine/ Cron Job)来执行测试任务。它负责完成自动部署软件包、向各台远程测试机器分发脚本并启动测试工具等工作。对于这部分,可以用图2-13来描述,其中底层的基础设施可以由STAX实现。
图2-13 自动化测试任务的安排和执行