基于Apache ZooKeeper和ActiveMQ的分布式软件测试方法

2016-02-13 07:50吕茜
现代计算机 2016年36期
关键词:测试程序软件测试结点

吕茜

(国家新闻出版广电总局监管中心,北京 102209)

基于Apache ZooKeeper和ActiveMQ的分布式软件测试方法

吕茜

(国家新闻出版广电总局监管中心,北京 102209)

云计算的发展使得分布式软件测试成为一种常态,节点的管理和通信是其中的两个关键问题。给出一个基Apache ZooKeeper和ActiveMQ的测试方法,能有效解决上述两个问题,并结合实际项目给出在Java平台使用的关键代码。

分布式测试;Apache ZooKeeper;Active MQ

0 引言

随着互联网和云计算技术的发展,软件测试领域也遭受着新的挑战和进行着新的变革。在传统软件测试中,被测程序和测试程序一般存在于同一个主机或者有限的多个主机之中。而在云计算流行的今天,尤其是在软件即服务SaaS(Software as a Service)提供的支持下,测试程序可以分布在多个数量客观的计算节点中,然后根据用户的计算请求,例如计算节点的数量或者根据当前在线的活动计算节点,动态分配可用的测试节点,然后再进行测试。以往这些节点的管理与使用都是测试人员或者系统管理人员负责,现在由于云计算的运用,需要计算机自动处理。那么如何管理这些节点以及怎么应用这些节点,成为当前测试技术的关键问题所在。

1 Apache ZooKeeper介绍及应用

如前文所述,当前测试技术的第一个关键问题就是测试节点的管理。当节点不多的时候,可以采用人工管理的方法,比如我们通过VMware或者Hyper-V等虚拟化平台创建了若干个测试节点,可以通过这些虚拟化平台提供的管理工具来检查测试节点的状态和负载。但是当节点很多,或者节点处于不同的区域时,进行人工管理就是一件非常费劲的时间。因为有的虚拟机虽然处于开机状态,但却因为某个原因系统没有响应,这时该测试节点其实是不可用的。或者当系统因为维护重启完成而不能及时发现该测试节点的可用性从而降低测试的实时性。还有一个问题,就是在实际项目当中,被测程序或者测试程序有许多的配置信息需要在运行时读取,如果配置信息需要更改,那么如何让所有的节点获知这个变化就非常繁琐了。

Apache ZooKeeper是一个开源文件应用程序接口(API),能使大型系统的分布式进程相互同步,这样所有提出请求的客户端就可以得到一致的数据。Apache ZooKeeper的数据模型类似于一棵树,如图1所示。

图1 Apache ZooKeeper数据模型

Apache ZooKeeper的节点(Znode)有如下几个特点:

①观察者:客户端可以在ZNode上设置观察者(watches)。所有对ZNode的修改都将触发观察者,之后再清除观察者。当一个观察者被触发,ZooKeeper就会发送一个通知给客户端。

②数据访问:数据被原子性的保存在命名空间的每一个ZNode中。Read可以获得与ZNode相关联的数据,write用来修改数据。每个结点都有一个ACL(Access Control List)来限制谁可以进行这些操作。

③临时节点:ZooKeeper也有临时结点的概念。这些结点在ZNode被创建的时候存在,当会话结束时,结点就会被删除。因为这样的临时结点不允许有子结点。

④数列节点:当创建一个ZNode,ZooKeeper还可以请求附加一个递增计数器到最后的路径。这个计数器对于父节点来说是唯一的。

基于这四个特点,ApacheZooKeeper主要有四个方面的应用:通知服务、配置管理、集群管理和分布式锁。我们在分布式测试中用到的就是配置管理和集群管理这两个个方向,其拓扑结构如图2和图3所示:我们以Java平台为例,测试程序部署在Apache

图2 Apache ZooKeeper配置管理

图3 Apache ZooKeeper集群管理

Tomcat之中,我们重写ServletContextListener类来实现

当测试程序启动之后自动在Apache ZooKeeper中注册,核心代码及注释如下所示:

至于后面如何从活跃节点中选取合适的节点来进行自动化测试,其算法不在本文的探讨范围之类,大体可以根据吞吐量或者节点的负载来进行选择。

Apache ZooKeeper配置管理的核心代码如下所示:

2 ActiveMQ介绍及应用

前文解决了节点的管理和选择问题,那么剩下的一个问题就是如何应用被选择的测试节点,尤其是被测程序和测试节点的通信问题。一般有如下方式:

(1)被测程序和测试程序的直接通信:基于被测程序所在主机与测试程序所在主机之间的通信

该方法提供了主机到主机之间的通信,从而当被测程序和测试程序之间需要通信的时候,可以采用本地方法直接调用,使得被测程序和测试程序从顶层看是在同一个主机之中。该方法有如下几种实现方式:SSH/Telnet、STAF等,如图4所示。

在SSH/Telnet方法中,被测主机和测试主机需要实现SSH/Telnet协议,对于双方都是类Unix的操作系统来说,SSH/Telnet都是自身就提供了的,对于Windows操作系统来说,可以通过安装Cygwin或者OpenSSH for win32来实现。STAF(Software Test Automation Framework)是一个自动化测试框架,支持Linux、Windows等多个操作系统,当被测主机和测试主机都安装并配置了STAF之后,双方可以通过STAF提供的服务进行通信,例如:process(远程调用)、fs(文件操作)等。使用这种主机到主机通信的方式有一个比较繁琐的地方在于系统的配置。例如SSH/Telnet方法时,Windows测试主机的配置以及主机的防火墙配置;STAF方法的被测主机和测试主机环境的搭建和权限的管理等。而优势也是比较明显的,就是在被测程序端可以直接控制测试程序的执行,就和在本地运行一样。

图4 主机到主机的通信

(2)被测程序与测试程序之间的间接通信:基于消息中间件的模式

与第一种主机到主机之间的通信不同,被测程序与测试程序之间紧密耦合,被测程序需要直接控制测试程序的管理,这种方法只能对特定的程序或者协议使用,比如Jenkins提供的Master和Slave之间的通信;Selenium Grid实现的分布式测试等等。前者只能用于Jenkins提供的持续集成,后者只能用于Selenium分布式网页测试。

那么有没有一种配置简单也具有较好通用性的解决方案呢?消息队列MQ(Message Queue)就是一种兼顾这两方面要求的技术。当前运用较多的开源MQ中间件有ActiveMQ、RabitMQ、Apache Kafa等,其中ActiveMQ运用较为广泛。

ActiveMQ是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ是一个完全支持JMS1.1和J2EE 1.4规范的JMS Provider实现。当前主流的开发语言都提供了针对ActiveMQ的客户端编程接口,比如:Java、C/C++、C#等。

在使用ActiveMQ时,测试程序在启动之后连接ActiveMQ服务器并创建队列/主题并作为消息的生产者;被测程序在启动之后连接ActiveMQ服务器并连接测试程序创建的队列/主题并作为消息的消费者。队列是一种一对一的模式,也就是一个消息生产者对应一个消息消费者,对于我们来说,就是一个被测程序对应一个测试程序;而主题订阅模式,一个消息生产者对应多个消息消费者,当一个被测程序写入需要测试的消息时,各个监听的消息消费者都可以接收并处理该消息,而当需要进行某项测试的时候,被测程序根据自身使用的编程语言使用上文所述的客户端API在队列/主题中发布一条新的消息,然后ActiveMQ会根据负载均衡,动态选择一个当前活动的消息消费者接收并处理该消息,从而实现被测程序和测试程序直接的通信。以队列形式为例的系统拓扑结构如图5所示:

图5 基于Active MQ的通信

不同的被测程序和测试程序,只需要使用不同的队列/主题即可实现环境的复用,而且环境的搭建较为简单,只需要维护ActiveMQ服务器或者集群即可。

使用ActiveMQ的关键代码如下所示:

3 基于Apache ZooKeeper和ActiveMQ的分布式测试系统架构

综上,本文设计的基于Apache ZooKeeper和ActiveMQ的分布式测试系统,即可以实被测程序和测试程序之间的直接通信,也能实现间接通信,具有较好的通用性和可扩展性,其架构如图6所示:

图6 系统架构

被测节点启动后,在ActiveMQ中创建相应的测试队列;测试节点启动后,连接ActiveMQ并监听其可处理的测试队列,同时在Apache ZooKeeper中注册临时节点。被测程序可以通过查询Apache ZooKeeper获得当前活动的测试程序节点,并按照一定的调度算法选择合适的测试程序进行测试;也可以通过ActiveMQ发送测试命令,由ActiveMQ进行负载均衡选择合适的测试程序进行测试。

在实际项目中,因为一些服务器在国外,所以如果我们使用本地的测试程序节点去测试这些国外服务器托管的被测程序,那么因为网络延迟的限制会导致测试效率低下。在这种情况下,我们通过将本地和国外的测试程序节点根据所在位置的不同,在Apache ZooKeeper中划分为两个组:Internal组和External组。测试程序节点启动时,根据其域名或者IP范围的不同,分别在相应的组注册。被测程序在发布测试任务时,根据其节点所处的位置,相应的从Internal组或者External组选择测试程序节点进行测试。而对于被测程序和测试程序与节点所处位置不同的情况,则直接使用ActiveMQ的队列进行处理。

4 结语

基于Apache ZooKeeper和ActiveMQ的分布式测试架构,环境搭建简单、可用性和可靠性高,能有效、方便地管理被测程序节点和测试程序节点,在分布式测试中发挥着巨大的作用。

[1]Apache ZooKeeper官方网站:http://ZooKeeper.apache.org/

[2]ActiveMQ官方网站:http://activemq.apache.org/

[3]ActiveMQ的几种通信方式:http://shmilyaw-hotmail-com.iteye.com/blog/1897635

[4]分布式服务框架ZooKeeper--管理分布式环境中的数据:https://www.ibm.com/developerworks/cn/opensource/os-cn-ZooKeeper/

A Distributed Testing Method Based on Apache ZooKeeper and Active MQ

LV Qian
(State Administration of Press,Publication,Radio,Film,and Television of the People's Republic of China,Beijing 102209)

Distributed testing becomes much more usual with the development of Cloud Computing in the nowadays,management and communication in the nodes are the two key points in it.Presents a testing method based on Apache Zookeeper and ActiveMQ that can handle the points perfectly,and demonstrates the usage in real project with key code on Java platform.

Distributed Testing;Apache ZooKeeper;Active MQ

1007-1423(2016)36-0052-06

10.3969/j.issn.1007-1423.2016.36.014

吕茜(1984-),女,河南郑州人,本科,中级工程师,从事领域为长期从事广播电视监测工作

2016-10-18

2016-12-18

猜你喜欢
测试程序软件测试结点
LEACH 算法应用于矿井无线通信的路由算法研究
基于八数码问题的搜索算法的研究
基于OBE的软件测试课程教学改革探索
航天软件测试模型构建与应用
EXCEL和VBA实现软件测试记录管理
基于Castle型机械手的三温量产测试平台实现
手机APP交互界面人因适合性测试程序的设计与实现
软件测试工程化模型及应用研究
电气自动化控制设备可靠性测试探讨