利用Hudson實現自動化測試的分布式執行
一、概述
目前,持續集成已成為當前許多軟件開發團隊在整個軟件開發生命周期內側重于保證代碼質量的常見做法。隨著測試的自動化率逐步提高,每天要需要自動執行的測試用例也就越來越多了,當我們發現,跑一次完整的測試需要幾個小時,測試的速度已遠遠跟不上編譯的速度的時候,我們自然要考慮如何加快測試的速度了——分布式執行測試用例,顯然是一個不錯的辦法,本文正是講述如何利用Hudson來實現自動化測試的分布式執行。
二、基本概念
1.什么是持續集成
簡而言之,持續集成(Continuous Integration)是一種軟件開發實踐,即團隊開發成員經常集成它們的工作,通常每個成員每天至少集成一次,也就意味著每天可能會發生多次集成。每次集成都通過自動化的構建(包括編譯,發布,自動化測試)來驗證,從而盡快地發現集成錯誤。
持續集成可以幫助我們做到:
1. 軟件構建自動化
2. 持續自動的構建檢查
3. 持續自動的構建測試
4. 構件生成后續過程的自動化
關于持續集成的更多概念和知識,本文不做深入闡述,有興趣的讀者可以參考以下鏈接:
互聯網行業應用持續集成實踐
2.關于Hudson
沒錯,Hudson正是一個能幫助我們實現持續集成的平臺。確切來說,Hudson是一個可擴展的持續集成引擎。 主要用于:
1. 持續、自動地構建/測試軟件項目
2. 監控一些定時執行的任務
更多關于Hudson的介紹和說明,請參考以下鏈接:
持續集成工具Hudson
三、分布式測試
1.串行執行測試
一般,我們會在Hudson上配置三個任務,分別是編譯任務、快速測試任務、慢速(完整)測試任務。這三個任務一般是順序串行執行的,上一個任務執行完畢了之后,下一個任務才能開始執行。
2.化整為零
串行執行測試,當需要運行的自動化測試用例較多時,任務執行的速度顯然不會讓我們滿意,尤其是完整測試任務。如何加快執行速度呢 我們首先會想到的是,可以化整為零,把slowtest任務(完整測試任務)分成多個小任務,這樣,就可以在多臺機器上同時執行,從而加快執行速度了。
然而,這樣的做法,缺點也很明顯——測試結果也被拆分,而且維護成本較高:
①slowtest的測試結果被拆分到各個小任務里,測試結果不方便統一顯示和分析。
②為達到最大速度,需要我們人工來把slowtest任務拆分成跟已有測試機器數量相等的測試任務,如果測試機器的數量新增或減少了,就需要我們再次人工調整任務。
③需要我們人工來指定不同的測試用例,平均分給各個測試任務,如果測試用例數量發生變化,也需要我們再次調整設置。 3.分布式執行!
一般的任務,是不能并發調度執行的,有多個構建請求時,即使有多個測試機器是空閑的,也必須按時間順序,一個接一個運行,典型的情況如下圖所示。
因此,上述化整為零的做法把slowtest任務拆分為多個子任務,從而達到多個任務同時可以同時執行的效果。
實際上,要加快自動化測試的速度,不一定需要多個任務同時執行——我們只需要多個構建同時執行。Hudson任務設置里有一個選項
可以設置任務是否可以多個構建同時執行。我們把這個選項勾選上后,當同時有多個構建請求時,只要有N個測試機器是空閑的,那就可以有N個構建同時執行!
4.遠程控制
Hudson可以設置一個任務構建完成后自動觸發另外的任務構建。這樣,編譯任務、快速測試任務、完整測試任務可以自動地有序執行。然而,這樣的自動觸發任務構建,上游任務只能對每個下游任務觸發一次。那么,當我們的quicktest任務構建完畢后,如何觸發多個slowtest任務構建呢 難道只能手工在網頁頁面上點擊“立即構建”嗎
當然不是。在Hudson任務設置里,如下圖,有這樣的一個設置,勾選并填寫”Authentication Token”上之后,我們就可以使用這個Token編寫腳本或程序來隨時觸發一個任務的構建了。
例如,用類似以下的Python代碼,就可以觸發一次”Your_Job”任務的一次構建。
如果”Your_Job”任務是帶參數(見后文)的,可以用類似以下的代碼觸發一次構建。
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。
posted on 2014-06-16 10:17 順其自然EVO 閱讀(210) 評論(0) 編輯 收藏 所屬分類: 測試學習專欄