實例解析Perl多進程技術的應用
本文和大家重點討論一下Perl多進程技術在自動化測試中的應用,Perl多進程的用戶接口是fork()函數以及對系統fork函數封裝的一些module。希望通過本文的介紹你對Perl多進程技術的概念有明確的認識。
Perl多進程技術在自動化測試中的應用
在IT產品系統測試的自動化項目中,經常有并行處理多個子任務的需求,為了提高測試效率,就需要用到Perl多進程或者多線程編程。文章介紹了Perl多進程的用法和適用場景,以及Perl多進程和多線程的關系。同時結合企業級IT產品系統測試的自動化特點,介紹了Perl多進程在這方面的應用。
Perl多進程
Perl語言是一種非常強大的腳本語言,其廣泛應用于系統維護,CGI(CommonGatewayInterface)編程,數據庫編程和自動化測試中。
多任務和并發處理一度被看作是判定優異操作系統的一個特性;同樣任何優秀從而流行的編程語言都會有并發的應用,而且都有各自的實現方法。Perl最開始在并發方面的應用就是Perl多進程。
Perl多進程的用戶接口是fork()函數以及對系統fork函數封裝的一些module。我們在使用Perl語言編程時,如果一個任務的某一個段可以或者需要并發很多執行,那么我們就會使用Perl的Perl多進程編程,例如同時向數據庫遞交多個記錄的查詢,同時完成多個系統信息的收集等等。
Perl的Perl多進程是這樣實現的:主進程每fork一個子進程,會把當前(主進程的)內存空間的所有變量都復制一份傳到新的進程里面,達到數據共享的目的。此外,主進程和子進程可以通過信號、管道等來通信。
在處理并發的方案中,Perl多進程依靠內存空間獨享提供了優秀的容錯性和健壯性。一個Perl多進程的系統不會由于其中一個進程的狀態不良而崩潰,每個進程都相對獨立地運作,很少會相互影響。
內存空間獨享也造就了Perl多進程不可避免的劣勢:資源負荷以及通信復雜,對于Perl來說,每個子進程都可以看作主進程的拷貝,這多少有些內存浪費,而且主進程的關鍵變量如果是“淺復制”到子進程的話,將會帶來一些意想不到的錯誤。另外,進程的創建和回收會帶來許多額外的負載,因此應當盡量避免頻繁地創建進程。
Perl多進程之間的通信方式有socket,管道,信號量等。在Linux平臺上,對于進程間大量信息的交互情況,最常用的是文件;這在用戶空間進程和系統內核空間進程之間的通信中的最為常用。
在談起Perl多進程的時候,不可避免的要說說它與Perl多線程的關系。
Perl多進程自動化測試場景介紹
很多大型IT公司都以版本控制來發布一系列的企業級系統產品,為此,周期性地更新產品的每個新版本和已有產品版本間的兼容性和互操作性測試結果,對客戶而言,尤為重要。而這類測試由于重復性強,工作量大,所以經常采用自動化。下面舉一個自動化測試中的常見場景例子。
假設有一個團隊從事企業級產品系統之間的兼容性和互操作性測試,需要在以1個月為周期的時間內完成一組配置的兼容性測試,團隊成員很少,但是負責的設備卻很多,往往每個人需要負責數十臺甚至數百臺機器,那么就必須采用多任務并發處理的自動化測試。該團隊測試存儲網絡中的服務器,交換機和存儲之間的互操作性。服務器包括很多個硬件平臺,操作系統包括Linux,Unix,Windows和VMware等,光纖交換機、主機總線適配器卡和存儲產品都涵蓋多個廠商品牌。這個團隊就需要建立一個端到端的自動化測試流程來支撐其測試任務。
下面是一個典型Perl多進程自動化測試環境的簡化圖示。
圖1.測試硬件環境概覽圖
其中,服務器有不同CPU架構的眾多品牌;它們上面運行的測試操作系統有Linux、Windows、VMware和各類虛擬機。物理層的光纖交換機(FCPhysicalLayerSwitch)是測試工具儀器,用于控制光纖的鏈路通斷等異常測試。
下面是Perl多進程自動化測試環境框圖。
圖2.自動化測試環境框圖
用一臺運行RedHatEnterpriseLinux系統的xServer作為Testconsole,上面安裝IBMRationalBuildForge用于測試的執行和管理。Testconsole通過以太網絡與各個server,switch,physical-layerswitch和storage進行通信,包括測試腳本的傳送,測試命令的信息交互。
這里說明一個測試用例,從而講述一個典型測試過程。“主機和光纖交換機之間的光纖斷開測試”:
Testconsole發命令到所有的主機,讓每個主機發現存儲磁盤,分區,格式化文件系統,mount或者分windows盤符,配置IO程序等;然后檢查各個被測應用程序以及系統的運行狀態,把結果返回Testconsole;
Testconsole發命令到所有的光纖交換機,讓每個光纖交換機檢查自身當前的運行狀態,然后返回結果到Testconsole;
Testconsole發命令到所有的存儲,讓每個存儲機器檢查自身當前的運行狀態,然后返回結果到Testconsole;
Testconsole在保證所有主機,交換機和存儲設備都進入要求的測試狀態后,開始進入測試,否則退出;
Testconsole發命令讓每個physical-layerswitch開始進行相關的光纖連接的斷開,然后等待一定的時間,再合上;
Testconsole發命令到所有的主機,檢測它們的狀態,等待所有的主機都恢復正常;
重復5、6兩步,測試持續24小時,完成。
可見,在這樣的自動化測試過程中,很多次需要Testconsole和幾十個或者幾百個機器進行命令交互,檢查狀態或者執行任務。這些操作當然可以是一個系統接著一個系統的執行;但是大多數任務是可以并發的,或者是可以同時進行從而提高測試效率的,比如同時訪問多個主機去啟動IO程序、檢查機器狀態,在登錄存儲上執行一個腳本的同時在多個主機上面執行一些應用程序,同時登錄所有的光纖交換機執行一些配置命令等。
另外,Testconsole和被測系統(Server、Switch、Storage等)之間的命令交互操作,需要使用PerlExpect模塊,或其它基于Expect的模塊例如Perl::SSH::Expect,Perl::Telnet::Expect等。很可惜,Expect模塊并不是線程安全的。
顯然,這就需要應用Perl的Perl多進程技術到自動化測試中。
【編輯推薦】