李金丽
摘要:本文面向Linux平台和平台下不同类型应用的特点,研究了自动化测试的技术和工具,并从功能测试和性能测试的角度对Linux平台下测试工作的自动化进行7分析和说明。文中提供的方法和技术已经成功应用于上海中标软件有限公司服务器产品和桌面产品的测试工作中。
关键词:Linux;自动化测试;软件应用
引言
现代软件规模的逐渐增加,使得软件测试的工作量越来越大,同时软件开发周期的缩短又要求尽量提高测试效率,而受开发资金的限制测试资源不可能大幅度增加,一切使得传统的手工测试已经无法满足现代软件开发的要求。另一方面,许多公司已经把软件测试作为保证软件质量、提高软件可靠性的主要手段之一,花费在软件测试上的资源已经占到整个软件研发成本的50~60%,软件测试能否按时完成已经成为软件能否按时交付的瓶颈。所有这一切都使得对软件测试实施自动化势在必行。
目前,市场上自动化测试工具不少,按用途可分为:功能测试工具,性能测试工具,测试管理工具等。就实现技术原理而言主要分为两类:一类是捕捉/回放技术,一类是编写测试脚本技术。捕捉/回放技术的脚本由捕捉时自动生成。捕捉阶段,工具记录用户的一系列鼠标点击和键盘按键操作,并将这些操作转化为脚本。回放时把这些脚本作为输入在被测程序上执行,根据执行后的状态信息和输出结果与原始记录的比对来判定是否存在差异。编写脚本技术需要用户以一个指定的脚本语言编写测试脚本,对于测试脚本的维护、测试执行的驱动以及测试结果的统计等可由用户自行实现,也可以使用专门的测试工具或者测试框架帮助完成。通过测试自动化的实施,可以使测试人员从大量的重复测试中解放出来。
在Linux平台下进行自动化测试,可以使用的商业测试工具并不是很多,但是由于开源软件产业的蓬勃发展,在各个开源社区维护的开源项目中提供了大量的、针对不同类型应用以及不同类型测试的测试工具,这些工具可以满足基本的自动化测试需求,同时可以结合具体应用的特点,通过进一步改造工具来完成测试自动化的目的。
本文所进行的自动化测试的研究对象主要针对Linux平台及平台之上的应用,测试的类型主要包括功能测试和性能测试。
自动化测试曲研究与应用
自动化测试的前提是无论采用何种测试技术和测试方法,组织已经积累了针对各种类型应用的包括完整的测试输入、测试执行步骤和预期输出的测试用例。
由于Linux是一个命令行组成的操作系统,因此采用脚本编程,按照预设的执行逻辑批量地执行命令行,是实施自动化测试时首先需要考虑的手段。为了实现更复杂的测试工作的自动化,也可以选择或者自行开发测试工具或测试框架。在选择工具或框架时,通常需要考虑是否具备如下几个要素:a,测试执行人员可以选择运行哪些测试组件/测试用例b,提供定义用例执行结果的输出方式,如提供成功、失败、未执行等函数供调用c,可以加载用户自定义的函数库d,提供用例执行的配置文件或者场景文件e,提供调试的机制f,提供日志输出方式g,提供结果统计输出等等。
在Linux平台下,借助工具或者其他手段实施测试的自动化时,需要关注以下几点:
(一)各种技术应用的前提。对于在开源社区和一些开源项目中获得的测试工具,首先需要了解工具适用于哪些类型应用的测试,以及工具发布后的发布说明和FAQ。开源的工具通常不像商业工具那样成熟稳定,因此找出工具的适用范围以及探索工具的实现程度是进行自动化测试应用的前提。
(二)各种技术应用的环境需求。对于各类工具,需要关注编译和运行时对各种包和库及其版本的依赖关系以及对预先安装的应用的依赖关系。这些在用户手册中都有详尽的说明。
(三)服务器性能监视器。大部分测试工具没有提供服务器端的性能监控功能,测试工程师需要根据实际的需求编写性能监控脚本来配合工具的使用。
下面结合曾经参与进行过的Linux平台下的自动化测试的研究,面向不同类别的测试用例自动化的需求,将主要从功能测试,如GUI测试、命令行客户端的测试,以及性能测试等几个方面对Linux平台下的测试工作的自动化进行分析和说明。
GZW自动化洲试
对于GUI测试的自动化,通常的测试工具所使用的捕捉/回放技术有两种,一种是通过记录界面的鼠标事件(如点击、移动)和键盘事件来完成录制和回放,另外一种则是录制和回放都是基于控件的识别和操作进行的,每个脚本的执行都是控件对象的属性改变或事件触发。我们从开源社区可以获得如上两种类型的运行于Linux平台之上的典型测试工具,如Knee和LDTP等。
(一)Xnee工具
在Linux操作系统的xll环境下,Xnee能够录制、回放和分发用户的动作。Xnee的捕捉/回放技术是记录鼠标事件和键盘事件。进入录制模式时,Xnee记录发送至和来自X server之间的协议数据拷贝,并生成Xneesession文件。在回放模式下,Xnee读取Xnee Session中的事件,模仿整个录制过程(即用户操作过程)完成和x server之间的通讯,被录制的应用软件(Xclient)则接收来自xserver的消息,完成预设的动作。
(二)LDTP测试工具/框架
Linux Desktop Testing Project(LDTP)测试工具/框架能够基于用户在应用界面的选择进行脚本的录制。LDTPI具使用了Gnome环境下的Accessibility库即辅助选项库(at-spi)。使用辅助选项能够获得应用通过AT-SPI协议提供的关于用户界面的信息和界面控件的当前状态或者属性。LDTPI具/框架的体系结构如下:
AT-SPI的基础思想就是为用户界面的可视化元素提供对应的辅助对象,而录制完成的每个脚本的执行都是基于这些辅助对象进行的。对于希望利用LDTPI具进行测试的应用,需要激活辅助选项。
(三)GUI自动化测试工具的应用
在实际的GUI自动化测试中,LDTPI具应用的场景会更广泛一些。LDTPI具可以识别窗口中的对象(如按钮),测试脚本使用LDTP的API接口,每个API接口对UI对象进行操作存在两个最基本的入口,即窗口和对象,窗口通过窗口的类型和名称(即标题)识别,对象通过希望操作的控件的类型和名称(标签或者关联的标签)识别。我们同样可以通过at-pokel具展现激活了辅助选项的应用程序窗口的对象及对象属性。在测试Linux桌面产品和服务器
产品的过程中,使用LDTPI具可以测试任何启用辅助选项的Gnome应用,如Mozilla,OpenOffice.org、Evolution邮件客户端,Nautilus文件浏览器等等,此外还可以测试UI界面基于Swing的Java应用,以及KDE4.O上基于QT4.0的应用等等。
而Xneel具所针对的应用程序类型就没有特别的限制,对于一些简单的窗口验证测试和界面的稳定性测试等则比较有效。Xnee相对于基于控件方式捕获和回放的工具而言,不用担心存在控件不能被识别的问题。
从使用的情况来看,各个工具也都因为实现技术而存在一定的缺陷,如两个工具均不能插入验证点,从而不能实现用例级别的结果验证;LDTP对于界面的个别元素捕获不到以及不能对不支持辅助选项的应用进行测试等等;而Xneel具生成的脚本可编辑性差,同时由于录制生成的脚本中的事件和屏幕坐标相关,因此当出现窗口弹出位置发生变化等问题时,就需要考虑回放时应该如何来处理这些变化。
命令行客户端的测试
(一)应用于命令行客户端测试的技术分析
Linux操作系统的精髓就是命令行,对于可以通过命令行批处理方式进行测试的客户端,Shell脚本语言是程序员测试时的首选,Shell提供了用户与内核进行交互操作的一种接口。
而对于测试交互式类型的客户端应用,Expect则比较擅长。Expect是基于tcl的用于测试交互式程序的工具包,它提供了创建交互式进程和读写它们的输入和输出的命令。Expect很适合编写测试程序,不管被测的软件是批处理式的(比如GCC),还是交互式的(比如GDB),它都可以很方便的捕捉程序的输出并且将程序的输入自动化。
对于编写完成的测试脚本,需要选择合适的框架来统一管理测试脚本,驱动测试脚本按照流程执行,以及为测试执行结果提供统一的输出等等。经过比较,各种测试框架中选出了DejaGnu和TET,因为这两个框架使用广泛、活跃度比较高、有活跃的社区组织支持。TET支持多种脚本语言,它提供对c/c++、Java、perl、shell,ksh,python,ruby,php,tcl/expect等众多语言的支持,支持分布式测试。Dejagnu即GNU测试框架,它提供了运行测试的统一前台,对于使用者而言,DejaGnu实际上就是一个Tel库,它提供了丰富的函数库,使得用户可以方便地编写自己的测试驱动程序。该框架的缺点是缺省只支持调用Expect编写的测试程序,如果需要调用其他语言编写的测试程序,则需要对框架进行扩展。
(二)实际应用
在Linux操作系统之上存在很多命令行客户端及交互式类型的客户端,如常见的网络服务程序sshl ftp,telnet,数据库客户端mysql,配置管理软件CVS。等等。使用上述的测试技术可以完成对这类应用程序的测试自动化。
在中标软件的测试实践中选择了Dejagnu框架,该框架符合POSIx1003,3测试框架标准,并定义了测试用例执行结果的输出函数,如pass,fail,xpass,xfail等等,因此可以使用框架的用例输出定义在日志中记载测试结果。
性能测试
性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。性能测试方法一般有基准测试、容量规划测试、峰谷测试和渗入测试等等,对于可再现性,基准测试是最好的方法,而如果需要从当前用户负载的角度考虑测试系统的上限,则应该使用容量规划测试。
(一)性能测试工具的选择
测试团队在规划性能测试时,出于对测试数据的可信度考虑,可以选择商业测试工具,如Loadrunner、Rati onalR 0b Ot、QAL Oad、Benchmark Factory等工具,另外SPEC(the Standard PerformanceEvaluation Corporation标准性能评估机构)提供的系列基准测试套件都是企业进行基准测试的最佳选择。
如果成本是首要考虑的因素,那么就不妨在一些开源测试站点(如http://www.opensourcetesting,org)和Linux开源社区的项目中寻找能够完成特定目标的性能测试工具。这些工具大部分针对性比较强,部署简单,当然很少工具能够与成熟的商业测试工具媲美。不过开源工具也具有自己的特点,如小巧,轻便,在各自擅长的领域可以提供优秀的解决方案等等。因此可以考虑准备一组开源测试工具,利用不同工具的特长完成性能测试自动化的需要。采用开源测试工具得到的性能测试数据,主要用于进行同类产品之间的横向对比以及同一产品不同版本之间的纵向对比。
(二)性能测试工具的应用
下面将从不同的测试需求出发。讨论如何利用开源测试工具进行性能测试的自动化。
1、服务器整机系统的性能测试
性能测试是衡量一个操作系统效率的关键步骤,对于Linux操作系统,Linux内核是其最核心的部分,其性能直接决定了操作系统的性能,内核性能测试的方法是针对Linux内核五大子系统:进程调度子系统、内存管理子系统、虚拟文件子系统、进程通信子系统和网络子系统的特点,测量出Linux内核完成工作量负载的响应时间、CPU时间和CPU利用率等参数,作为衡量标准。在实际测试中我们采用了如下一些基准测试工具:
1Lmbench:用来测试1inux操作系统的cpu计算处理能力、进程调度、内存读写性能;测试主要可使用bw_dhrv和bw—mem,lat proc三个测试命令,分别对应于整数性能测试,读写内存测试,进程调度测试。
2Bonnie++:磁盘I/O测试工具,主要用于测试磁盘和文件系统的性能。它可以测试文件的创建,读,写和删除等操作,既可以测试小文件,也可以测试大的单个文件。
3Web应用服务器的性能测试
在中标软件的web邮件服务器测试中采用了Apache组织的开源项目工具JMeter。JMeter可以用于测试静态或者动态资源的性能(文件、Servlets、Perl脚本、java对象、数据库和查询、ftp服务器或者其他的资源)。JMeter用于模拟在服务器、网络或者其他对象上附加高负载以测试他们提供服务的受压能力,或者分析他们提供的服务在不同负载条件下的总性能情况。用户可以使用JMeter提供的图形化界面分析性能指标或者在高负载情况下测试服务器/脚本/对象的行为。
4数据库性能测试
基于开源的数据库性能测试工具并不是很多,这些工具本身都预先提供了一组测试用例如The DatabaseOpensource Test Suite(DOTS)工具,提供了8个基本用例和2个高级用例,并支持对DB2、Oracle、Sybase、MySQL和Pos tgreSQL等多种类型数据库进行压力测试和负载测试,另外一些工具则预先构造了支持不同负载模式测试的配置,如最新版本的Hammerora(The Open Sourceoracle Load Test T001)工具就提供了专门针对Oracle数据库进行测试的设定基准测试TPC—C和TPC—H的模式选项以及编写驱动脚本等功能。从实践过程来看,预置测试用例的工具存在的缺陷是用户无法对这些用例根据实际测试需求进行拓展,而可编程性强的测试工具则在支持的数据库类型上存在一定的限制。
结束语
针对Linux平台和平台下的应用进行自动化测试,需要测试人员熟悉Linux平台下的脚本开发技术,并以开源社区中存在的大量的功能和性能测试工具作为自动化测试的研究起点。各个测试团队需要根据自身的测试需求对各种工具和技术进行分析和选择,同时根据实践活动判断工具可以完成的测试内容以及目前尚存的缺陷。这些都将为我们应用工具进行更大规模的自动化测试提供必要的基础。