自动化测试架构之说
测试人员经常想象——在无人值守的情况下,每天晚上测试工具自动运行成千上万的测试用例,第二天早晨去上班,一打开电脑就能看到所有的测试任务已全部执行完毕,测试报告也整整齐齐地出现在我们面前。如果能亲身经历这种场景,一定会感到无比兴奋和轻松!这种情景不是梦想,也并不遥远,完全是可以实现的,只要借助一套灵活、可扩展的自动化测试框架即可帮助我们实现梦想。
为何要建立自动化测试架构
在过去几十年中,自动化测试已经有了良好的发展。最初的测试工具只提供了简单的捕捉/回放功能:记录键盘和鼠标的操作,并捕捉屏幕,然后通过播放所记录的操作进行验证。这样的脚本很难维护,从而要求开发功能和灵活性更强的测试工具,并能将这些工具很好地整合起来,使整个自动化测试过程的各个部分或各个阶段能很好地衔接起来。这就需要构造一个完整的自动化体系,形成自动化测试的流水线,使整个测试过程一气呵成。这其中,不仅要包括自动化测试的执行,还要包括自动化测试脚本的开发、软件包自动部署以及测试报告自动生成等,才能将自动化开发、执行和日常工作融合在一起。这一切都需依赖于自动化测试架构。
针对上述讨论,我们深知自动化测试所面临的挑战。面对挑战,必须采取以下这些相应的对策,通过构建适应性很强的自动化测试框架来解决一系列问题。
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)远程机器执行测试任务:通过代理实现,而代理由控制中心来控制。