呂茜
(國家新聞出版廣電總局監(jiān)管中心,北京 102209)
基于Apache ZooKeeper和ActiveMQ的分布式軟件測試方法
呂茜
(國家新聞出版廣電總局監(jiān)管中心,北京 102209)
云計(jì)算的發(fā)展使得分布式軟件測試成為一種常態(tài),節(jié)點(diǎn)的管理和通信是其中的兩個(gè)關(guān)鍵問題。給出一個(gè)基Apache ZooKeeper和ActiveMQ的測試方法,能有效解決上述兩個(gè)問題,并結(jié)合實(shí)際項(xiàng)目給出在Java平臺(tái)使用的關(guān)鍵代碼。
分布式測試;Apache ZooKeeper;Active MQ
隨著互聯(lián)網(wǎng)和云計(jì)算技術(shù)的發(fā)展,軟件測試領(lǐng)域也遭受著新的挑戰(zhàn)和進(jìn)行著新的變革。在傳統(tǒng)軟件測試中,被測程序和測試程序一般存在于同一個(gè)主機(jī)或者有限的多個(gè)主機(jī)之中。而在云計(jì)算流行的今天,尤其是在軟件即服務(wù)SaaS(Software as a Service)提供的支持下,測試程序可以分布在多個(gè)數(shù)量客觀的計(jì)算節(jié)點(diǎn)中,然后根據(jù)用戶的計(jì)算請求,例如計(jì)算節(jié)點(diǎn)的數(shù)量或者根據(jù)當(dāng)前在線的活動(dòng)計(jì)算節(jié)點(diǎn),動(dòng)態(tài)分配可用的測試節(jié)點(diǎn),然后再進(jìn)行測試。以往這些節(jié)點(diǎn)的管理與使用都是測試人員或者系統(tǒng)管理人員負(fù)責(zé),現(xiàn)在由于云計(jì)算的運(yùn)用,需要計(jì)算機(jī)自動(dòng)處理。那么如何管理這些節(jié)點(diǎn)以及怎么應(yīng)用這些節(jié)點(diǎn),成為當(dāng)前測試技術(shù)的關(guān)鍵問題所在。
如前文所述,當(dāng)前測試技術(shù)的第一個(gè)關(guān)鍵問題就是測試節(jié)點(diǎn)的管理。當(dāng)節(jié)點(diǎn)不多的時(shí)候,可以采用人工管理的方法,比如我們通過VMware或者Hyper-V等虛擬化平臺(tái)創(chuàng)建了若干個(gè)測試節(jié)點(diǎn),可以通過這些虛擬化平臺(tái)提供的管理工具來檢查測試節(jié)點(diǎn)的狀態(tài)和負(fù)載。但是當(dāng)節(jié)點(diǎn)很多,或者節(jié)點(diǎn)處于不同的區(qū)域時(shí),進(jìn)行人工管理就是一件非常費(fèi)勁的時(shí)間。因?yàn)橛械奶摂M機(jī)雖然處于開機(jī)狀態(tài),但卻因?yàn)槟硞€(gè)原因系統(tǒng)沒有響應(yīng),這時(shí)該測試節(jié)點(diǎn)其實(shí)是不可用的?;蛘弋?dāng)系統(tǒng)因?yàn)榫S護(hù)重啟完成而不能及時(shí)發(fā)現(xiàn)該測試節(jié)點(diǎn)的可用性從而降低測試的實(shí)時(shí)性。還有一個(gè)問題,就是在實(shí)際項(xiàng)目當(dāng)中,被測程序或者測試程序有許多的配置信息需要在運(yùn)行時(shí)讀取,如果配置信息需要更改,那么如何讓所有的節(jié)點(diǎn)獲知這個(gè)變化就非常繁瑣了。
Apache ZooKeeper是一個(gè)開源文件應(yīng)用程序接口(API),能使大型系統(tǒng)的分布式進(jìn)程相互同步,這樣所有提出請求的客戶端就可以得到一致的數(shù)據(jù)。Apache ZooKeeper的數(shù)據(jù)模型類似于一棵樹,如圖1所示。
圖1 Apache ZooKeeper數(shù)據(jù)模型
Apache ZooKeeper的節(jié)點(diǎn)(Znode)有如下幾個(gè)特點(diǎn):
①觀察者:客戶端可以在ZNode上設(shè)置觀察者(watches)。所有對ZNode的修改都將觸發(fā)觀察者,之后再清除觀察者。當(dāng)一個(gè)觀察者被觸發(fā),ZooKeeper就會(huì)發(fā)送一個(gè)通知給客戶端。
②數(shù)據(jù)訪問:數(shù)據(jù)被原子性的保存在命名空間的每一個(gè)ZNode中。Read可以獲得與ZNode相關(guān)聯(lián)的數(shù)據(jù),write用來修改數(shù)據(jù)。每個(gè)結(jié)點(diǎn)都有一個(gè)ACL(Access Control List)來限制誰可以進(jìn)行這些操作。
③臨時(shí)節(jié)點(diǎn):ZooKeeper也有臨時(shí)結(jié)點(diǎn)的概念。這些結(jié)點(diǎn)在ZNode被創(chuàng)建的時(shí)候存在,當(dāng)會(huì)話結(jié)束時(shí),結(jié)點(diǎn)就會(huì)被刪除。因?yàn)檫@樣的臨時(shí)結(jié)點(diǎn)不允許有子結(jié)點(diǎn)。
④數(shù)列節(jié)點(diǎn):當(dāng)創(chuàng)建一個(gè)ZNode,ZooKeeper還可以請求附加一個(gè)遞增計(jì)數(shù)器到最后的路徑。這個(gè)計(jì)數(shù)器對于父節(jié)點(diǎn)來說是唯一的。
基于這四個(gè)特點(diǎn),ApacheZooKeeper主要有四個(gè)方面的應(yīng)用:通知服務(wù)、配置管理、集群管理和分布式鎖。我們在分布式測試中用到的就是配置管理和集群管理這兩個(gè)個(gè)方向,其拓?fù)浣Y(jié)構(gòu)如圖2和圖3所示:我們以Java平臺(tái)為例,測試程序部署在Apache
圖2 Apache ZooKeeper配置管理
圖3 Apache ZooKeeper集群管理
Tomcat之中,我們重寫ServletContextListener類來實(shí)現(xiàn)
當(dāng)測試程序啟動(dòng)之后自動(dòng)在Apache ZooKeeper中注冊,核心代碼及注釋如下所示:
至于后面如何從活躍節(jié)點(diǎn)中選取合適的節(jié)點(diǎn)來進(jìn)行自動(dòng)化測試,其算法不在本文的探討范圍之類,大體可以根據(jù)吞吐量或者節(jié)點(diǎn)的負(fù)載來進(jìn)行選擇。
Apache ZooKeeper配置管理的核心代碼如下所示:
前文解決了節(jié)點(diǎn)的管理和選擇問題,那么剩下的一個(gè)問題就是如何應(yīng)用被選擇的測試節(jié)點(diǎn),尤其是被測程序和測試節(jié)點(diǎn)的通信問題。一般有如下方式:
(1)被測程序和測試程序的直接通信:基于被測程序所在主機(jī)與測試程序所在主機(jī)之間的通信
該方法提供了主機(jī)到主機(jī)之間的通信,從而當(dāng)被測程序和測試程序之間需要通信的時(shí)候,可以采用本地方法直接調(diào)用,使得被測程序和測試程序從頂層看是在同一個(gè)主機(jī)之中。該方法有如下幾種實(shí)現(xiàn)方式:SSH/Telnet、STAF等,如圖4所示。
在SSH/Telnet方法中,被測主機(jī)和測試主機(jī)需要實(shí)現(xiàn)SSH/Telnet協(xié)議,對于雙方都是類Unix的操作系統(tǒng)來說,SSH/Telnet都是自身就提供了的,對于Windows操作系統(tǒng)來說,可以通過安裝Cygwin或者OpenSSH for win32來實(shí)現(xiàn)。STAF(Software Test Automation Framework)是一個(gè)自動(dòng)化測試框架,支持Linux、Windows等多個(gè)操作系統(tǒng),當(dāng)被測主機(jī)和測試主機(jī)都安裝并配置了STAF之后,雙方可以通過STAF提供的服務(wù)進(jìn)行通信,例如:process(遠(yuǎn)程調(diào)用)、fs(文件操作)等。使用這種主機(jī)到主機(jī)通信的方式有一個(gè)比較繁瑣的地方在于系統(tǒng)的配置。例如SSH/Telnet方法時(shí),Windows測試主機(jī)的配置以及主機(jī)的防火墻配置;STAF方法的被測主機(jī)和測試主機(jī)環(huán)境的搭建和權(quán)限的管理等。而優(yōu)勢也是比較明顯的,就是在被測程序端可以直接控制測試程序的執(zhí)行,就和在本地運(yùn)行一樣。
圖4 主機(jī)到主機(jī)的通信
(2)被測程序與測試程序之間的間接通信:基于消息中間件的模式
與第一種主機(jī)到主機(jī)之間的通信不同,被測程序與測試程序之間緊密耦合,被測程序需要直接控制測試程序的管理,這種方法只能對特定的程序或者協(xié)議使用,比如Jenkins提供的Master和Slave之間的通信;Selenium Grid實(shí)現(xiàn)的分布式測試等等。前者只能用于Jenkins提供的持續(xù)集成,后者只能用于Selenium分布式網(wǎng)頁測試。
那么有沒有一種配置簡單也具有較好通用性的解決方案呢?消息隊(duì)列MQ(Message Queue)就是一種兼顧這兩方面要求的技術(shù)。當(dāng)前運(yùn)用較多的開源MQ中間件有ActiveMQ、RabitMQ、Apache Kafa等,其中ActiveMQ運(yùn)用較為廣泛。
ActiveMQ是Apache出品,最流行的,能力強(qiáng)勁的開源消息總線。ActiveMQ是一個(gè)完全支持JMS1.1和J2EE 1.4規(guī)范的JMS Provider實(shí)現(xiàn)。當(dāng)前主流的開發(fā)語言都提供了針對ActiveMQ的客戶端編程接口,比如:Java、C/C++、C#等。
在使用ActiveMQ時(shí),測試程序在啟動(dòng)之后連接ActiveMQ服務(wù)器并創(chuàng)建隊(duì)列/主題并作為消息的生產(chǎn)者;被測程序在啟動(dòng)之后連接ActiveMQ服務(wù)器并連接測試程序創(chuàng)建的隊(duì)列/主題并作為消息的消費(fèi)者。隊(duì)列是一種一對一的模式,也就是一個(gè)消息生產(chǎn)者對應(yīng)一個(gè)消息消費(fèi)者,對于我們來說,就是一個(gè)被測程序?qū)?yīng)一個(gè)測試程序;而主題訂閱模式,一個(gè)消息生產(chǎn)者對應(yīng)多個(gè)消息消費(fèi)者,當(dāng)一個(gè)被測程序?qū)懭胄枰獪y試的消息時(shí),各個(gè)監(jiān)聽的消息消費(fèi)者都可以接收并處理該消息,而當(dāng)需要進(jìn)行某項(xiàng)測試的時(shí)候,被測程序根據(jù)自身使用的編程語言使用上文所述的客戶端API在隊(duì)列/主題中發(fā)布一條新的消息,然后ActiveMQ會(huì)根據(jù)負(fù)載均衡,動(dòng)態(tài)選擇一個(gè)當(dāng)前活動(dòng)的消息消費(fèi)者接收并處理該消息,從而實(shí)現(xiàn)被測程序和測試程序直接的通信。以隊(duì)列形式為例的系統(tǒng)拓?fù)浣Y(jié)構(gòu)如圖5所示:
圖5 基于Active MQ的通信
不同的被測程序和測試程序,只需要使用不同的隊(duì)列/主題即可實(shí)現(xiàn)環(huán)境的復(fù)用,而且環(huán)境的搭建較為簡單,只需要維護(hù)ActiveMQ服務(wù)器或者集群即可。
使用ActiveMQ的關(guān)鍵代碼如下所示:
綜上,本文設(shè)計(jì)的基于Apache ZooKeeper和ActiveMQ的分布式測試系統(tǒng),即可以實(shí)被測程序和測試程序之間的直接通信,也能實(shí)現(xiàn)間接通信,具有較好的通用性和可擴(kuò)展性,其架構(gòu)如圖6所示:
圖6 系統(tǒng)架構(gòu)
被測節(jié)點(diǎn)啟動(dòng)后,在ActiveMQ中創(chuàng)建相應(yīng)的測試隊(duì)列;測試節(jié)點(diǎn)啟動(dòng)后,連接ActiveMQ并監(jiān)聽其可處理的測試隊(duì)列,同時(shí)在Apache ZooKeeper中注冊臨時(shí)節(jié)點(diǎn)。被測程序可以通過查詢Apache ZooKeeper獲得當(dāng)前活動(dòng)的測試程序節(jié)點(diǎn),并按照一定的調(diào)度算法選擇合適的測試程序進(jìn)行測試;也可以通過ActiveMQ發(fā)送測試命令,由ActiveMQ進(jìn)行負(fù)載均衡選擇合適的測試程序進(jìn)行測試。
在實(shí)際項(xiàng)目中,因?yàn)橐恍┓?wù)器在國外,所以如果我們使用本地的測試程序節(jié)點(diǎn)去測試這些國外服務(wù)器托管的被測程序,那么因?yàn)榫W(wǎng)絡(luò)延遲的限制會(huì)導(dǎo)致測試效率低下。在這種情況下,我們通過將本地和國外的測試程序節(jié)點(diǎn)根據(jù)所在位置的不同,在Apache ZooKeeper中劃分為兩個(gè)組:Internal組和External組。測試程序節(jié)點(diǎn)啟動(dòng)時(shí),根據(jù)其域名或者IP范圍的不同,分別在相應(yīng)的組注冊。被測程序在發(fā)布測試任務(wù)時(shí),根據(jù)其節(jié)點(diǎn)所處的位置,相應(yīng)的從Internal組或者External組選擇測試程序節(jié)點(diǎn)進(jìn)行測試。而對于被測程序和測試程序與節(jié)點(diǎn)所處位置不同的情況,則直接使用ActiveMQ的隊(duì)列進(jìn)行處理。
基于Apache ZooKeeper和ActiveMQ的分布式測試架構(gòu),環(huán)境搭建簡單、可用性和可靠性高,能有效、方便地管理被測程序節(jié)點(diǎn)和測試程序節(jié)點(diǎn),在分布式測試中發(fā)揮著巨大的作用。
[1]Apache ZooKeeper官方網(wǎng)站:http://ZooKeeper.apache.org/
[2]ActiveMQ官方網(wǎng)站:http://activemq.apache.org/
[3]ActiveMQ的幾種通信方式:http://shmilyaw-hotmail-com.iteye.com/blog/1897635
[4]分布式服務(wù)框架ZooKeeper--管理分布式環(huán)境中的數(shù)據(jù):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-),女,河南鄭州人,本科,中級(jí)工程師,從事領(lǐng)域?yàn)殚L期從事廣播電視監(jiān)測工作
2016-10-18
2016-12-18