qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          利用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。
          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.分布式方案
            如下圖。
           四、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預設的環境變量。

          posted on 2014-06-16 10:17 順其自然EVO 閱讀(210) 評論(0)  編輯  收藏 所屬分類: 測試學習專欄

          <2014年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 泰和县| 东安县| 盐津县| 勐海县| 成都市| 岳阳县| 安国市| 通辽市| 东兴市| 承德县| 鹤壁市| 余庆县| 女性| 寻甸| 黑龙江省| 信丰县| 竹溪县| 嘉鱼县| 安仁县| 乐昌市| 若尔盖县| 武陟县| 宝山区| 昔阳县| 天气| 昭平县| 集贤县| 沙河市| 长沙县| 印江| 双峰县| 右玉县| 巩义市| 离岛区| 沅陵县| 洪雅县| 荃湾区| 务川| 宝清县| 讷河市| 高清|