汪 旺,夏 凤,陈 哲,黄志球
(1.南京航空航天大学计算机科学与技术学院,江苏 南京 210016;2.阿里巴巴(中国)网络技术有限公司,浙江 杭州 310099)
随着测试流程的不断规范以及软件测试技术[1]的进一步细化,软件测试自动化[2,18,20]已经日益成为一种不可忽视的技术。能否借助该技术以及如何借助它规范测试流程,提高特定测试活动的效率,是一个需要研究的重要问题。
软件自动化测试使用机器自动进行测试执行[3]和测试结果判断,其特点是在测试中部分使用了程序或是机器的能力,目的在于减少资源消耗、扩大测试范围和充分利用机器与程序的能力。软件自动化测试技术的出现显著提高了测试工作[4]的效率。
目前,软件测试自动化[5]的研究领域主要集中在软件测试流程的自动化管理[6]以及动态测试[7]的自动化(如单元测试、功能测试以及性能测试方面)。与手工测试相比,测试自动化的优势明显。首先,自动化测试可以提高测试效率,测试人员更加专注于新的测试模块的建立和开发,从而提高测试覆盖率;其次,自动化测试更便于测试资产的数字化管理,在整个测试生命周期内可以复用测试资产,这个特点在功能测试和回归测试中尤其具有意义;此外,测试流程自动化管理可以使机构的测试活动开展更加过程化。
但是在服务器集群的环境下,自动化测试[8]相对脆弱,维护比较困难。以阿里巴巴旗下网站的开发测试平台为例,目前的自动化测试环境管理存在诸多问题,严重制约了自动化测试效率的提升。因此,如何有效地对自动化测试进行监控管理,是一个重要而未被很好解决的问题。研究面向自动化测试的服务器管理监控平台能够加强对大规模集群测试服务器的统一管理和监控,提高发现测试服务器问题的及时性和处理效率,增加出现问题后的自我恢复能力,从而释放了大量的人力资源,大幅提升了工作效率。
本文基于控制系统理论[19,21],结合软件自动化测试的需求背景和Web开发框架[9]的原理及相关技术,介绍阿里巴巴中文站的自动化研发协作平台,在分析总结现有工作的基础上,给出面向服务器集群的自动化测试监控平台的模块设计和实现,最后指出该平台目前存在的问题,并对以后的研究工作进行展望。
AONE是阿里巴巴自动化研发协作平台,系统地管理整个研发过程中的各项活动。在该平台上,项目经理创建项目并分配资源,开发人员提交代码、编译审计及打包,完成后公司内部即时聊天工具阿里旺旺会发消息提醒测试人员接手测试,测试后进行发布。倚天测试环境平台是测试服务器管理与申请平台,通过它可以申请需要的测试服务器。而通过守护神平台则可以执行自动化脚本并生成测试质量报告。
AONE上应用编译通过后会生成一个新的RPM(Red Hat Package Manager)包,是Red Hat的软件包管理。RPM包里面包含可执行的二进制程序,该程序和Windows的软件包中的.exe文件类似,是可执行的。包中还包括程序运行时所需要的文件,并放到FTP(File Transfer Protocol)服务器上,根据AONE发出的消息,这个消息包括应用名称、发布需求的ID、生成的RPM包地址等,会在倚天测试环境平台上申请测试服务器,搭建和部署相应的测试环境,搭建完成后,就可以在守护神平台上请求执行自动化脚本,直至完成。
运行自动化脚本[10]之前首先要部署好服务器,即在测试机上搭建测试环境。服务器部署方法经历从手动部署到一键部署脚本,再到watchdog监控程序的过程。
手动部署要求用户手动输入一系列的命令。首先要获取应用RPM包的FTP地址,然后申请一套测试服务器,并登录测试服务器,获取RPM包和最新的配置文件antx.properties,该配置文件存储了测试服务器所需的配置项,将配置项注入RPM包,最后执行启动操作。这种方法比较耗时费力,效率低下。
一键部署脚本可以在Linux测试服务器下自动获取应用的分支或RPM包,获取最新的antx.properties(也可以选择不更新),可以一键自动化部署和重启。但也存在一些缺点,比如不支持中文提示,不检查应用名正确性,也不能够正确处理某些异常情况。
watchdog监控程序是一款自动化测试服务器管理程序,通过HTTP请求来完成各种功能,但是目前这仅仅是一个维持基本功能的版本,有许多可以优化的地方。它还没有可视化的UI界面,如更新RPM包地址需要SQL语句来完成,除此之外,添加测试环境或更改配置都需要修改代码,重新打包来完成,不够方便。
目前阿里巴巴三大测试的公共环境维护状况如下:
1)RPM包地址由watchdog监控程序更新;
2)自动化环境由watchdog监控程序根据AONE发布情况部署;
3)公共环境由one-click.sh(一键部署脚本)定时更新,依赖watchdog监控程序数据库;
4)性能环境手动管理,不定期更新;
5)机器由dragoon监控,它是阿里巴巴自主研发的高性能、大并发的通用监控系统,主要是系统监控,包括各种操作系统,如 Linux、Solaris、Aix、Windows。它由运维中心进行运营管理,只能监控环境的性能指标和系统关键信息。
分析目前的测试环境,发现存在性能测试环境不能实现自动更新,主干RPM包管理机制不够透明等问题。今后AONE实施自主发布,自动化环境需要实现大规模测试服务器群的部署,watchdog监控程序在测试机上搭建测试环境已经不能满足需求,因此亟待对已有的服务器部署功能进行扩展,引入面向服务器集群的自动化测试监控平台,对自动化环境、公共环境、性能环境进行统一的管理和监控,并实现一定的环境自我恢复能力。
面向服务器集群的自动化测试[11]监控平台主要有2方面的功能,即部署测试环境和监控测试服务器。开发人员提交测试后,测试人员需要在大规模测试服务器群上安装开发提供的RPM包,即部署测试环境,然后才能验证所提交代码的正确性。用户在自己的计算机上通过浏览器访问该测试监控平台,进行申请测试服务器和部署环境等一系列操作。平台服务器收到命令后会在相应的测试服务器上部署环境,并返回部署状态等监控信息,从而使用户通过浏览器就可以监控和查看测试服务器的状态,系统功能如图1所示。
图1 系统功能示意图
AONE上应用编译通过后会生成一个新的RPM包并放到FTP服务器上,然后AONE会触发部署操作。部署控制模块在相应的测试服务器传送和安装Agent软件。Agent的信号处理器收到部署环境的信号,就会调用one-click.sh脚本进行环境部署。该脚本在每个执行模块运行到最后(成功或失败)时,返回部署状态和相关消息。部署状态(成功、失败或超时)会通过Agent的状态提取器存储在缓存中。环境监控模块则会获取该状态,传达给告警中心。如果部署失败,监控模块会告诉部署控制模块进行重置。其中部署控制模块是通过部署分发模块来分配部署工作,该模块包括一个应用部署信息查询列表,会周期性进行刷新。
部署测试环境时,首先会有调度中心按序对每一个环境生成部署线程,其次通过部署计划表查询依赖顺序,监听前置依赖的就绪状态,然后线程会给Agent下达部署命令,Agent会及时将部署状态和消息反馈到调度中心,从而更新部署计划列表中的环境部署状态。环境部署模块设计包括分发环境部署计划、生成临时部署计划、应用依赖关系管理、部署计划列表和配置部署计划设置。
环境监控模块有查看环境监控信息、配置环境监控设置、环境监控调度和环境监控查询远程服务4个部分。
2.2.1 环境监控调度
环境监控调度是环境监控模块在获取部署状态后传达给告警中心,如果部署失败,监控模块会告诉部署控制模块进行重置的过程。
在环境监控调度中,新建或修改环境的健康度检查配置并确认保存时,监听服务立即被触发。触发监听服务的过程如图2所示。
图2 激发监听服务的过程图
图2中部署状态是指环境部署计划中的部署状态正处于大于等于“安装进行中”,小于“启动失败”、“启动成功”或“启动超时”的中间状态。
触发以后,监听器会给Agent发送健康检查命令。Agent首先解析JSON(JavaScript Object Notation,一种轻量级的数据交换格式),解析检查内容,逐个执行检查内容中的command内容。然后,如果是进程检查,直接组装检查结果,并发送到Redis(一个key-value存储系统);如果是URL检查,请求URL并对返回内容进行校验,将校验结果发送到Redis;如果是Service检查,则直接执行检查命令启动Service检查程序,但要将监控系统中心发送过来的JSON参数追加在命令后面,由Service检查程序组装检查结果并发送到Redis。这里假设是Service检查。
接下来,Agent会周期性地调用Service检查。对于用户自定义的Service检查,只要继承AbstractServiceHealthChecker类,然后实现setRedisHost和check方法。打包成jar包后连二方库(即所引用的公司内部其他项目的代码包)一起上传到SVN(Subversion,是一个免费的、开放源码的版本控制系统)。图3是Service检查定制框类类图[7]。
图3 Service检查定制框类
Service检查完,将检查结果存入Redis。监听器维护一个定时器,它会启动一个定时任务用于周期性提取存储在Redis中的环境检查结果数据,并将结果存入数据库,如果部署失败,会触发失败重新部署,环境监控调度如图4所示。
图4 环境监控调度总体示意图
2.2.2 应用搭建算法
应用搭建是指部署一套环境时可能需要搭建几个应用,而应用之间存在一定的依赖关系,一旦一个应用搭建不成功,就会影响到对它依赖的其他应用。
应用依赖搭建算法描述如图5所示。
图5 应用依赖搭建方案
该算法采用的是并行搭建,运用按层级关系搭建应用的思想,避免了绝对的串行搭建会影响环境部署效率的问题。
每个应用搭建完成后发送触发信息。总的搭建时间为有向图中最长路径上每个应用的搭建时间之和。每一组搭建应用过程采用设定超时时间方式。
应用依赖搭建算法中,会对一个有向无环图(Directed Acyclic Graph,DAG)进行拓扑排序[8](Topological Sort)。拓扑排序是将有向无环图G中所有顶点排成一个线性序列,使得对图中任意一对顶点u和v,若<u,v>∈E(G),则u在线性序列中出现在v之前。
拓扑排序算法的每一步均是输出当前无后继(即出度为0)的结点。对于一个DAG,按此方法输出的序列是逆拓扑次序。因此设置一个栈(或向量)T来保存输出的结点序列,即可得到拓扑序列。若T是栈,则每当输出结点时,只需做入栈操作,排序完成时将栈中结点依次出栈即可得拓扑序列。若T是向量,则将输出的结点从T[n-1]开始依次从后往前存放,即可保证T中存储的结点是拓扑序列。
拓扑排序主要代码如下:
函数topo()调用函数noSuccessors(),如果返回值为-1,表明该有向图有环,给出错误提示;否则,把返回的没有后继的结点保存到数组sortedArray中,并调用函数deleteVertex(int delVert)删去该结点,并删去从该结点发出的全部有向边。
重复以上步骤,直到有向图中不存在没有后继的结点为止。最后输出拓扑序列。
其中,函数 noSuccessors()和函数 deleteVertex(int delVert)代码如下:
函数noSuccessors()用于返回没有后继的结点。对有向图中的每个结点检查从该结点出发是否有边,如果从某结点出发没有边,表明该结点没有后继,函数返回该结点;如果检查完有向图发现图中每个结点都有边,表明该有向图中有环,函数返回-1。
函数deleteVertex(int delVert)用于删去有向无环图中没有后继的结点,并删去从该结点发出的全部有向边。
随着测试流程的不断规范以及软件测试技术的进一步细化,软件测试自动化[12]日益成为一种不可忽视的技术。但目前自动化测试相对比较脆弱,维护起来比较困难,如何有效地对自动化测试进行监控管理[22-25],是一个重要问题。
本文结合软件自动化测试[13]的需求背景,对自动化测试[14]环境的服务器管理监控进行了初步的研究分析。笔者基于Web开发框架,在Eclipse平台[15]上,开发出了一个面向自动化环境的服务器管理监控平台。该平台主要有部署和监控测试环境2大功能,加强了对测试服务器的统一管理和监控。
该平台在阿里巴巴的实践证明,它可以提高发现大规模集群测试服务器问题的及时性和处理效率,增加出现问题后的自我恢复能力,大幅提升测试[16]效率,并为进一步设计有效的自动化管理方法提供了基础。
目前所做的工作中仍存在许多不足之处,在下一步的工作中,将对系统的高级功能,比如环境出错自动重启、按部署计划定时搭建环境、全部重搭自化[17]环境等进行充分的验证。
[1]Myers G J,Sandler C,Badgett T.The Art of Software Testing[M].John Wiley& Sons,2011.
[2]李鹏,杨永艳.基于业务数据的大型企业SOA测试方法[J].计算机工程,2012,38(4):60-62.
[3]宋波,张忠能.基于系统功能测试的软件自动化测试可行性分析[J].计算机应用与软件,2006,22(12):31-33.
[4]颜炯,王戟,陈火旺.基于模型的软件测试综述[J].计算机科学,2004,31(2):184-187.
[5]单锦辉,姜瑛,孙萍.软件测试研究进展[J].北京大学学报(自然科学版),2005,41(1):134-145.
[6]杨文,黄文涛.通用自动测试系统的软件设计与实现[J].工业控制计算机,2012(1):79-80.
[7]王先平,齐逸.面向服务计算中Web服务动态绑定模型研究[J].计算机工程与设计,2010(19):4165-4167.
[8]李玮.软件自动化测试混合框架的研究与实现[J].北京交通大学学报,2007(4):27-31.
[9]杨宁,刘丹军.基于JFinal框架的Java Web应用开发研究[J].电脑知识与技术,2014(7):74-76.
[10]史永莉,陈元琰,罗晓曙,等.软件自动化测试方案的效益分析[J].微计算机信息,2010(6):218-219.
[11]汪邦慧,徐从来.软件自动化测试框架设计与实践[J].卫星电视与宽带多媒体,2013(11):57-61.
[12]张坤.基于业务流程驱动自动化测试研究与实现[J].计算机光盘软件与应用,2013(5):268-269.
[13]马春燕,朱怡安,陆伟.Web服务自动化测试技术[J].计算机科学,2012,39(2):162-169.
[14]邢翠芳,杜晶,赵海冰.软件自动化测试技术研究[J].电脑知识与技术,2013(12):61-62.
[15]Eckel B.Thinking in Java[M].3rd Edition.Prentice Hall,2013.
[16]牟永敏,姜宇,张志华.软件自动化测试中热点路径的研究[J].计算机工程与科学,2011,33(6):79-83.
[17]聂长海.关于软件测试的几点思考[J].计算机科学,2011,38(2):1-3.
[18]Chen Zhe,Gu Yi,Huang Zhiqiu,et al.Model Checking Aircraft Controller Software:A Case Study[DB/OL].http://onlinelibrary.wiley.com/doi/10.1002/spe.2242/abstract,2013-11-21.
[19]Chen Zhe.Control Systems on Automata and Grammars[J/OL]. http://comjnl.oxfordjournals.org/content/early/2013/10/25/comjnl.bxt125,2013-10-25.
[20]Chen Zhe,Zhang Daqiang,Zhu Rongbo,et al.A review of automated formal verification of Ad Hoc routing protocols for wireless sensor networks[J].Sensor Letters,2013,11(5):752-764.
[21]Chen Zhe.On the generative power of ω-grammars and ωautomata[J].Fundamenta Informaticae,2011,111(2):119-145.
[22]Chen Zhe,Gilles Motet.Towards better support for the evolution of safety requirements via the model monitoring approach[C]//Proceedings of the ACM/IEEE 32nd International Conference on Software Engineering(ICSE 2010).2010:219-222.
[23]Chen Zhe,Gilles Motet.Nevertrace claims for model checking[C]//Proceedings of the 17th International SPIN Workshop on Model Checking of Software(SPIN 2010).2010:162-179.
[24]Chen Zhe,Gilles Motet.System safety requirements as control structures[C]//Proceedings of the 33rd Annual IEEE International Computer Software and Applications Conference(COMPSAC 2009).2009:324-331.
[25]Chen Zhe,Gilles Motet.A language-theoretic view on guidelines and consistency rules of UML[C]//Proceedings of the 5th European Conference on Model Driven Architecture-Foundations and Applications(ECMDA-FA 2009).2009:66-81.