利用Hudson實現自動化測試的分佈式執行

1、概述
目前,持續集成已成爲當前許多軟件開發團隊在整個軟件開發生命週期內側重於保證代碼質量的常見作法。隨着測試的自動化率逐步提升,天天要須要自動執行的測試用例也就愈來愈多了,當咱們發現,跑一次完整的測試須要幾個小時,測試的速度已遠遠跟不上編譯的速度的時候,咱們天然要考慮如何加快測試的速度了——分佈式執行測試用例,顯然是一個不錯的辦法,本文正是講述如何利用Hudson來實現自動化測試的分佈式執行。
2、基本概念
1.什麼是持續集成
簡而言之,持續集成(Continuous Integration)是一種軟件開發實踐,即團隊開發成員常常集成它們的工做,一般每一個成員天天至少集成一次,也就意味着天天可能會發生屢次集成。每次集成都經過自動化的構建(包括編譯,發佈,自動化測試)來驗證,從而儘快地發現集成錯誤。
持續集成能夠幫助咱們作到:
1. 軟件構建自動化
2. 持續自動的構建檢查
3. 持續自動的構建測試
4. 構件生成後續過程的自動化
關於持續集成的更多概念和知識,本文不作深刻闡述,有興趣的讀者能夠參考如下連接:
互聯網行業應用持續集成實踐
持續集成相關術語解釋
2.關於Hudson
沒錯,Hudson正是一個能幫助咱們實現持續集成的平臺。確切來講,Hudson是一個可擴展的持續集成引擎。 主要用於:
1. 持續、自動地構建/測試軟件項目
2. 監控一些定時執行的任務
更多關於Hudson的介紹和說明,請參考如下連接:
持續集成工具Hudson
基於hudson的持續集成 FAQ
3、分佈式測試
1.串行執行測試
通常,咱們會在Hudson上配置三個任務,分別是編譯任務、快速測試任務、慢速(完整)測試任務。這三個任務通常是順序串行執行的,上一個任務執行完畢了以後,下一個任務才能開始執行。
 html


2.化整爲零?
串行執行測試,當須要運行的自動化測試用例較多時,任務執行的速度顯然不會讓咱們滿意,尤爲是完整測試任務。如何加快執行速度呢?咱們首先會想到的是,能夠化整爲零,把slowtest任務(完整測試任務)分紅多個小任務,這樣,就能夠在多臺機器上同時執行,從而加快執行速度了。
 shell



然而,這樣的作法,缺點也很明顯——測試結果也被拆分,並且維護成本較高
①slowtest的測試結果被拆分到各個小任務裏,測試結果不方便統一顯示和分析。
②爲達到最大速度,須要咱們人工來把slowtest任務拆分紅跟已有測試機器數量相等的測試任務,若是測試機器的數量新增或減小了,就須要咱們再次人工調整任務。
③須要咱們人工來指定不一樣的測試用例,平均分給各個測試任務,若是測試用例數量發生變化,也須要咱們再次調整設置。
3.分佈式執行!
通常的任務,是不能併發調度執行的,有多個構建請求時,即便有多個測試機器是空閒的,也必須按時間順序,一個接一個運行,典型的狀況以下圖所示。
 api



所以,上述化整爲零的作法把slowtest任務拆分爲多個子任務,從而達到多個任務同時能夠同時執行的效果。
實際上,要加快自動化測試的速度,不必定須要多個任務同時執行——咱們只須要多個構建同時執行。Hudson任務設置裏有一個選項

能夠設置任務是否能夠多個構建同時執行。咱們把這個選項勾選上後,當同時有多個構建請求時,只要有N個測試機器是空閒的,那就能夠有N個構建同時執行!
 服務器



4.遠程控制
Hudson能夠設置一個任務構建完成後自動觸發另外的任務構建。這樣,編譯任務、快速測試任務、完整測試任務能夠自動地有序執行。然而,這樣的自動觸發任務構建,上游任務只能對每一個下游任務觸發一次。那麼,當咱們的quicktest任務構建完畢後,如何觸發多個slowtest任務構建呢?難道只能手工在網頁頁面上點擊「當即構建」嗎?
固然不是。在Hudson任務設置裏,以下圖,有這樣的一個設置,勾選並填寫」Authentication Token」上以後,咱們就可使用這個Token編寫腳本或程序來隨時觸發一個任務的構建了。
 併發



例如,用相似如下的Python代碼,就能夠觸發一次」Your_Job」任務的一次構建。分佈式



若是」Your_Job」任務是帶參數(見後文)的,能夠用相似如下的代碼觸發一次構建。ide




5.測試用例分配
爲了讓slowtest任務的每一次構建能執行不一樣的自動化測試用例,咱們須要指定該任務爲帶參數的任務,在任務設置中勾選
並指定相應的參數。例如,咱們指定一個字符串參數名爲suite,用於指定某一次構建是運行哪個suite裏的case。這樣,在具體的某一次構建中,suite會以環境變量的方式存在。固然,若是構建的時候沒有指定suite參數,那麼suite就會默認爲None。
 工具



這樣,在一個任務的每次構建中,就能夠根據環境變量suite的值去取不一樣的測試用例來運行了。
6.測試結果回收
當分佈式測試執行完畢後,slowtest的測試結果仍然被拆分到了多個構建之中,如何把這些測試結果統一收集起來呢?
例如,咱們極可能須要把全部測試用例的運行生成的JUnit格式的測試結果報表合併在一塊兒,即咱們須要收集slowtest任務每一次構建所產生的xml測試結果文件。
解決辦法是,咱們在slowtest任務裏設置Hudson把咱們須要的一些文件在構建完成後打包存檔起來。例以下圖這樣設置,則Hudson在每一次構建完成後,會將test_report文件夾下的全部xml文件上傳至服務器保存下來。
 測試



這樣,咱們也就能夠本身編寫腳本或程序去獲取這些文件了。例如,相似以下Python代碼,能夠得到test-slowtest任務第67次構建所生成的全部文件,打包保存爲tmp.zip。ui


 


7.萬事俱備
至此,分佈式執行自動化測試用例所須要的條件都已具有。一個具體的可行自動化測試分佈式執行方案以下。
 



1) test-build-only
o 編譯任務,能夠設置Hudson輪詢SCM,每當提交代碼至服務器後,此任務會自動觸發。
2) test-quicktest
o 快速測試任務,在編譯任務成功完成後,自動觸發,快速執行一些最基本的自動化測試用例,確保新提交代碼後,程序產品的基本功能沒有問題。
3) test-slowtest-dispatch
o 此任務在test-quicktest執行成功後自動觸發,它所作的工做是把全部須要執行的自動化測試用例分配爲多個suite,併爲每一個suite觸發一次test-slowtest-distributed任務的構建。
4) test-slowtest-distributed
o 分佈式執行的主要任務,能夠多個構建同時執行,根據任務參數不一樣來執行不一樣的自動化測試用例。
5) test-slowtest-report
o 分佈式測試彙總任務,當test-slowtest-distributed任務在一次分佈式執行中的全部構建執行完畢後,此任務負責將這些構建產生的測試結果收集在一塊兒。
8.分佈式方案
以下圖。


 

4、FAQ & Tips
• 在何時,怎樣觸發report任務呢?
o 能夠爲distributed任務再設定一個end參數,默認爲空,在dispatch任務執行的腳本或程序裏,觸發最後一個distributed任務的構建時,才指定該構建的end爲True。在distributed任務執行的時候,若是end爲True,再去觸發report任務,觸發方式固然也是用腳本或程序觸發。
• report任務如何知道該收集distributed任務的哪幾回構建的測試結果呢?
o 能夠由distributed任務經過傳遞參數的方式告訴report應該收集哪幾回構建的測試結果。到底該如何肯定是哪幾回構建呢?Hudson定義了一些環境變量,咱們在任務執行的shell或批處理中可使用到。例如,能夠在最後一次構建的時候,讀取環境變量BUILD_NUMBER,再設法肯定本次分佈式執行共有多少次構建,便可以知道哪些構建是report應該收集測試結果文件的了~
• report任務收集到的測試結果文件,因爲不對,Hudson不認可怎麼辦呢?
o 實際上,只須要一個批處理命令便可以修改文件的建立時間:copy *.xml+,,
• report任務構建時,怎樣知道distributed任務全部的構建都已完成呢?
o 打開Hudson網頁,試試在網址後面加上「api」,如http://HUDSON/job/test/63/api,而後刷新一下頁面,你將知道更多如何遠程操做Hudson的方法。
• 在環境變量中添加WinRAR的安裝路徑,便可以在批處理中使用WinRAR命令來解壓archive
• Hudson會經過等待的方式來保證BUILD_NUMBER較小的構建會先完成。所以,妥善安排suite的順序和suite包含的自動化測試用例數能夠提升測試速度哦~
• 能夠限制一個任務只能在某些機器上運行,也能夠限制它只能在具備某些Label的機器上執行~
點擊我能夠查看關於Hudson預設的環境變量。
5、參考資料
【1】. Hudson官網 http://hudson-ci.org/

(做者:yejinxin)

 

相關文章
相關標籤/搜索