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