李青 楊曉娟 朱博 張新玲



摘要:Autotest是一個開源自動化測試框架,能夠大規模、完全自動化地完成Linux底層系統測試,處理測試過程中出現的內核錯誤、硬件死機、網絡故障等。Autotest易于集成現有的內核和硬件測試,便于測試人員編寫簡單的測試用例和加入分析工具進行測試結果分析。Autotest框架實現分布式處理大量Linux內核測試,不僅能充分測試Linux內核和硬件的穩定性、可靠性和健壯性,還能有效提高測試效率。
關鍵詞關鍵詞:自動化測試;Linux內核;分布式;開源框架
DOIDOI:10.11907/rjdk.161123
中圖分類號:TP306文獻標識碼:A文章編號文章編號:16727800(2016)007001403
隨著軟件行業的日益成熟,軟件自動化測試成為保障軟件質量、加速軟件開發的重要手段。現存的自動化測試框架主要是針對上層軟件的測試,被測對象與底層平臺分離,需假設底層平臺穩定可靠。而當底層平臺本身成為被測對象時,以上假設將不成立。目前針對底層系統的自動化測試技術還不成熟。因此,內核測試一般采用人工方式,測試效率較低。
Autotest是完全自動化開源測試框架,針對包括內核和硬件的底層系統進行測試,提供終端到終端的自動化功能和性能測試,使測試者能夠在不了解內部框架的情況下,簡單進行基本測試和集成測試。Autotest設計之初是為了解決開源的Linux系統測試不足的需求,隨著功能的不斷拓展,Autotest能夠執行許多不同的測試,增加新的結果分析工具,集成已存在的測試框架,展現了強大的包容性、擴展性和易用性。
1幾種測試框架介紹
1.1AutoBench
IBM Autobench是針對Linux系統的開源測試框架,基于httperf的Perl腳本編寫而成,構建和引導測試腳本運行。通過該框架,用戶能夠便捷地設置測試用例的執行環境和參數,并行執行測試。但是,該框架的測試控制機制和錯誤處理機制不夠健全,擴展性和維護性較差,不利于用戶二次開發。
1.2Linux Test Project
Linux Test Project(LTP)是目前較為流行的Linux功能測試和性能測試框架,主要用來測試Linux內核基本特性。它提供測試套件,用戶能夠驗證Linux的可靠性、耐用性和穩定性,亦可針對不同的測試目的和LTP中的接口函數進一步開發新測試用例。但是,它缺乏對測試結果的分析以及對日志的解析工作,本質僅是多個測試的集合,因此LTP并不能作為通用和完全自動化測試內核的框架。
1.3Xentest
Xentest是一個專門針對Xen虛擬化測試的自動化測試框架,通過在Xen上運行Linux下的標準測試套件對底層虛擬化進行測試。但Xentest只能緊密圍繞Xen,不能成為內核或硬件測試的通用框架。
1.4Crackerjack
CrackerJack是一個完整的內核自動化測試框架,主要目標是通過回歸測試尋找不同內核版本間不相容的API。它是一個很有價值的測試工具,但是功能太過狹隘。
1.5其它工具
Linux自動化測試框架研究逐漸深入。張達運等提出一種基于Lua的Linux內核測試工具,降低了Linux內核及驅動接口測試的編程難度。韓濤等設計一種Linux下自動化測試執行管理工具,通過對測試過程和測試資源進行管理,提高了測試效率。
2Autotest框架研究
2.1總體架構
Autotest采用分層結構以滿足不同規模集群的測試需求。Autotest框架從上到下主要分為4層,如圖1所示。
(1)用戶接口:包括Web接口、命令行接口和DJANGO。作用是便于用戶與Autotest交互,包括管理作業、管理Client主機、查看結果等。
(3)Serve端:包括調度數據庫和AutoServ服務。主要任務是分配和調度測試作業執行。調度數據庫用于選擇要執行的作業,開啟Autoserv進程;Autoserv用于管理Client中運行的作業、檢查Client工作狀態、修復失效的Client節點、管理作業的執行情況等。
(4)Client端:實際執行測試。執行單個測試任務或者作為集群中的一個測試節點執行測試。
Autotest框架工作流程如圖2所示。測試Linux系統發布新版本,首先將測試任務導入AutoServ測試作業隊列中;AutoServ負責將測試任務下達到Client端,在Client端安裝測試環境,如Linux新版本等,并執行測試任務;測試結束后將結果發送到結果分析工具中分析,如存在缺陷則為系統打補丁。整個過程中Client端作為Autotest系統的最底層,在單個機器上運行簡單的測試。Server端作為指揮中心,自動安裝和執行客戶端,協調多機測試。
2.2Autotest Client
Client端主要用于測試本地Linux系統內核,包含多種常見的Linux內核測試用例,用戶可直接使用這些測試用例,亦可進行二次開發或者重新創建測試用例。Client端采用Python編寫而成,提供C語言的編譯和執行工具,使得每個測試用例均可與額外的C語言編寫資源捆綁,易于集成已實現的測試工具。Autotest框架提供了標準化接口,在Client端編寫測試用例時,均能調用該框架中的接口實現功能,例如作業控制、錯誤處理機制、結果收集和分析機制等,用戶無需手動定義這些機制。
Client端僅為測試單個計算機Linux底層系統提供基礎功能。以往測試不同硬件配置下的內核,要在多臺物理設備上安裝Client端,手動執行測試并收集分散在不同物理設備中的測試結果,這對于大規模計算機集群測試十分復雜且低效。為解決此問題,Autotest的Server端應運而生。Server端圍繞Client端設計一個單獨的層。AutoServ進程通過SSH遠程連接被測對象,自動安裝Autotest Client端執行作業,并將結果從被測機返回。用戶可以任意設置被測對象的數量,同時將結果收集到Server端分析。
Server端提供了恢復失敗測試系統機制。AutoServ通過監聽串行控制臺、網絡控制臺和系統日志的輸出,與外接服務相互作用,收集被測機的故障信息。最壞的情況下,AutoServ進程可以記錄失敗作業運行的測試和發生故障的測試機最后的已知狀態。在被測機出現故障導致系統崩潰時,AutoServ首先嘗試把機器返回到已知的良好狀態,然后對被測機重新安裝。最后,將已修復的故障機重置到具有最小的人為干預的工作狀態。
2.4前端與調度器
Autoserv作為一個獨立的應用程序,不能滿足擴展到數千個測試機和實現共享機器池有效利用的要求。為了滿足這些需求,Autotest框架將Autoserv頂層封裝為共享服務,用戶通過一個基于Web或基于命令行的界面,與中央服務器實例交互,而不是直接執行Client端或Server端。
前端是一個Web應用程序調度測試,監控執行中的測試并管理測試機器。調度器是在AutoServ運行的一個進程,其目的是為了執行和監控Autoserv進程上運行的后臺程序。調度器連續匹配可用的機器和預定的測試作業,開啟Autoserv進程執行這些作業,并監視流程完成。在整個執行過程中,更新數據庫中每個作業的狀態,跟蹤作業進度。完成后,調度器調用解析器將Autoserv的結果記錄到測試結果數據庫。調度器與前端通過該數據庫交互,執行已計劃的測試作業。最后,用戶進行結果分析。
當測試規模擴展到成千上萬臺機器時,自動化測試平臺的健康管理變得至關重要。調度器啟動特殊Autoserv流程,在每次作業前檢查機器運行狀況,在數據庫中標記不能被修復的機器。此外,調度器定期復檢已知宕機的機器,捕捉可能發生的任何手動修復。所有Autoserv進程如果在一個Server端上運行,性能會嚴重下降。調度器支持對正在運行的進程全局限制,以避免整個系統停頓。
Autotest可以自動生成控制文件運行選定的測試,通過前端Web頁面選擇測試用例,指定內核安裝和選擇有效的分析工具,從而使Autotest輕松運行比較復雜的測試,而不需要投入很多精力編寫控制文件。
3實驗
3.1測試方法與背景
實驗平臺由1臺服務器及20臺常規計算機搭建而成。Serve端主機使用浪潮英信SA5212L型服務器,Client端使用浪潮VITE2230型計算機,詳細配置如表1所示。
3.2測試結果
在不同規模的計算機集群上測試每個計算機內存讀寫速率,圖3為通過Serve端啟動20個Client同時進行內存讀寫時,每個計算機的平均內存讀寫速率,同時啟動20個Client端執行完測試所需時間結果,如圖4所示。顯然,Autotest通過Serve端同時啟動大型集群上的Client端進行測試和在單個計算機上測試所消耗的時間相近。而逐個執行相同數量計算機節點上的單機測試,時間消耗遠高于使用Autotest框架進行測試。
4結語
Autotest強大、穩健,入門容易,便于理解和維護。Autotest適用于各種測試規模,分布式測試性能穩定可靠、效率高。同時,Autotest測試框架易于集成已有的測試工具和測試結果分析工具,方便測試使用和開發測試用例。開源的Autotest正吸引越來越多的人加入框架的開發與維護,使之成為更加完善和強大的自動化測試工具。
參考文獻參考文獻:
KAMALESH BIBULAL,BALBIR SINGH.Keeping the Linux kernel honest[J].In Linux Symposium,2008(1):1929.
MARTIN BLIGH,ANDY P WHITCROFT.Fully automated testing of the Linux kernel[J].In Linux Symposium,2006(1):113125.
Linux test project\[EB/OL\].http://ltp.sourceforge.net.
SUBRATA MODAK,BALBIR SINGH.Building a robust Linux kernel piggybacking the Linux test project[J].In Linux Symposium,2008(2):91100.
朱巖.應用Linux Test Project組件測試Linux內核應用研究[J].中國測試,2009,35(5):5558.
DAVID BERRERA,LI GE,STEPHANIE GLASS,et al.Testing the Xen hypervisor and Linux virtual machines[J].In Linux Symposium,2005(1):271288.
HIRO YOSHIOKA.Regression test framework and kernel execution coverage[J].In Linux Symposium,2007(2):285296.
張達運,汪漢新.基于Lua的Linux內核測試工具開發[J].計算機工程,2011,37(11):283284.
韓濤,高靜.Linux下自動化測試執行管理工具的設計與實現[J].計算機系統應用,2010,19(4):112115.
Autotest\[EB/OL\].https://github.com/autotest
責任編輯(責任編輯:杜能鋼)