一個用於網站自動化測試的生態系統實現

來源:互聯網
上載者:User

標籤:android   des   http   os   檔案   資料   io   2014   

這是我在從事網站自動化測試的工作當中構建出的一個“生態系統”。“生態系統”這個概念是我從公司的前輩身上學到的,他一直以來都認為自動化測試人員不應僅僅局限於編寫測試代碼,還應該讓整個自動化測試的過程(測試代碼的持續整合、分發、執行等)都自動化,形成一個“系統”,這個系統的自動化程度越高,自動化測試人員就越省力。


一、概念

這裡我畫了一張:


之所以稱之為“生態系統”,是因為建成之後需要的人為幹涉很少,其餘的時間都是系統內部迴圈運作。作為自動化測試人員的你只需要提交代碼,之後便可以在AutomationDashboard上看到啟動並執行結果了,其餘的事情都由系統內部消化。當然,結果的分析還是需要人來完成,機器還沒有聰明到可以靈活分析出各種各樣讓case fail掉的原因。

我們可以把整個系統看作一個黑盒子,那麼上面的圖可以變成:


實際上這裡畫的人不僅限於自動化測試人員,也可以是:

(1)產品的管理者,比如產品經理需要從自動化迴歸測試知道這次release有無延遲風險;

(2)團隊的管理者,比如開發經理、QA經理需要從自動化的daily/weekly regression知道最近的代碼品質如何;

(3)開發人員,他們也許會想通過quick regression(提交的產品代碼被部署到測試環境之後啟動並執行測試)知道自己剛提交的代碼有沒有破壞系統的準系統;

(4)其他幫忙做自動化測試的開發人員、剛剛開始學習編寫自動化測試代碼的手動測試人員,他們不必關心生態系統的內部實現。


二、實現

說完概念,接下來該說說具體實現了。我這裡講的是我認為最適合我所測試的產品的實現,工具不止一種,方式不止一種。Jenkins可以用TeamCity或其它CI替換,git也可以是svn或tfs,AutomationDahsboard可以用.NET、SpringMVC、ROR等等實現,運行測試的slave可以是Windows/Linux/Mac(土豪!),總之選擇一種最適合你所測試的產品的實現。還有一點就是自動化測試代碼是用關鍵字驅動思想實現的,這是另外一個話題了,有時間另外寫篇文。

好,進入正題。依次說說系統的每個重要組成部分吧:


1、SCM(Source Code Management)。我選的是git,可以是git伺服器(公司自己搭建了一個git server),也可以是一個bare repo(http://www.saintsjd.com/2011/01/what-is-a-bare-git-repository/) 。


2、CI(continuous integration)。我選的是部署方便、外掛程式豐富的Jenkins。

它的職責是:

(1)從git上取出代碼,build(.NET對應msbuild,如果是ruby則不用build了,直接部署即可);

(2)把build好的*.dll部署(這裡即是拷貝)到所有的slave上;

(3)啟動或停止所有slave上的AutomationService(後面還會講到AutomationService),從而控制測試的執行。

我在Jenkins的這些個job配置起來還是比較繁瑣的,要細講又可以另外寫一篇文了。這裡就特別提到兩個很實用的外掛程式吧:

(1)Parameterized Trigger Plugin(https://wiki.jenkins-ci.org/display/JENKINS/Parameterized+Trigger+Plugin):可以在一個build step中觸發其它project的build。


它最有用的就是這個“Block until the triggered projects finish their builds”選項,勾上的話Jenkins就能在所有trigger的project完成build之後(而非僅僅trigger其它project的build,不等它們完成就繼續下一個build step)再繼續下一個build step,做到真正的依次執行每個build step。


(2)NodeLabel Parameter Plugin(https://wiki.jenkins-ci.org/display/JENKINS/NodeLabel+Parameter+Plugin):在所有“Possible nodes”標有指定標籤(“Label”)的Jenkins節點(就是Jenkins master或Jenkins slave)上觸發指定project(被觸發的project是參數化的)。

比如我有一個project叫“StartClassicROLATServiceOnAllNodes”,它有一個build step是這樣設定的:


再來看看“StartClassicROLATServiceOnASingleNode”這個project的設定:


這個project有一個Node類型的參數,參數名“NodeX”與之前Label Factory中的“NodeX”對應,“Possible nodes”選的是“ALL”,那麼列出的所有node(master、10.107.122.152、10.107.122.153、10.107.122.154)都在判斷範圍之內(判斷其是否有“Node”標籤,有則執行project)。

另外,列出的所有node我都為其加了一個“Node”標籤。


這樣,當我trigger “StartClassicROLATServiceOnAllNodes”之後,就會在master、10.107.122.152、10.107.122.153、10.107.122.154這4個node上同時執行“StartClassicROLATServiceOnASingleNode”。


3、AutomationDashboard,這裡姑且譯作“自動化測試控制台”吧。實際上它應該和Jenkins一起並稱控制台,不過因為Jenkins有API可以調用,所以想做的畫兩者也是可以統一成一個web介面的。這個dashboard完全是用.NET+IIS+SQLServer一點點從資料庫設計構建、資料訪問層、業務層、表現層做起來的,要細講……額……又會是另外一篇文了(Oh man, not again!)。反正我覺得,雖然我是做自動化測試工作的,但不應該把自己局限於測試。為了更好地進行自動化測試,開發網站、安裝配置虛擬機器以及其它要用到的工具,都應該抽時間去學習、掌握。

好,來說說這個dashboard。這裡只講兩個主要組成部分,一個網站(以下簡稱dashboard)、一個Windows Service(以下簡稱ATService)和一個console application(以下稱ConsoleRunner):

(1)dashboard,它的主要功能:

a、展示測試的健全狀態:有多少正在運行/執行完畢,分別在哪台slave上執行等等。

b、通過call Jenkins的API來trigger Jenkins的job,間接控制測試的執行。

c、展示測試的結果:發生錯誤的是哪個case、出錯時間、錯誤資訊、代碼回溯(stack trace)、甚至可以包含一張出錯時的。

主要介面如下:

a、Summary,顧名思義是匯總資訊,case有多少pass多少fail、case按分類每一類有多少等等。(其實這裡我少做了一張很重要的圖,就是coverage餅狀圖)


b、Queue,測試隊列,包含當前正在啟動並執行、運行完的、等待啟動並執行test fixture或test case(依據測試載入器的不同,NUnit、JUnit、RSpec等,fixture的叫法可能不同,總之就是包含多個test case的集合)。可以啟動、停止、終止(終止之後可以清空)測試執行或清空當前隊列。


c、TestCase,生態系統中的所有測試案例會展示在這裡,可以看到它們最後一次執行的時間和狀態(pass/fail),點擊某條case可以跳轉到該條case的所有test result。可以按狀態(pass/fail/other)篩選用例,可以勾選部分用例重新執行、或重新執行所有fail的case。“Reload Test Cases”主要是考慮到*.dll檔案中的test case可能會在某次部署之後發生變化,需要重新載入。不過後來我修改了Jenkins裡的job在每次部署之後都自動重新載入,所以這個按鈕其實沒什麼用了。


d、TestSuite,包含多個fixture的集合是一個suite。勾選多個suite點擊“Run Suite”即可把這些suite中包含的fixture添加到Queue。


這裡的suite是對NUnit中的Category的一個補充,點擊“New Suite”你可以任意選擇fixture來組成自己想要的suite:


e、TestResult,展示所有test case的運行結果,可以按test case id進行篩選,點擊TC#這一列的id就只顯示這條case的結果。


點右邊的藍色“i”表徵圖可以跳到這條結果的詳細頁面,功能暫未啟用,根據RunnerMessage和RunnerStackTrace可以知道報錯的代碼位置,進而嘗試重現問題。


(2)ATService。這個Windows Service(slave都是Windows,稍後會講)被安裝到了每個slave上,用以向dashboard詢問“現在有沒有分配給我的test fixture/case?”,如果有且當前slave閒置話就抓過來運行,運行完畢彙報結果。

還記得Queue(隊列)吧?無論你在TestCase還是TestSuite頁面挑選了test case/suite想要運行,都只是把它們添加到隊列當中(準確地說就是往Queue這張資料庫表中INSERT記錄),而不會給它們分配slave。只有當Jenkins啟動了slave上的ATService之後,ATService才會去Queue表中自己抓取(就是打上標記說這條fixture/case已經有主了,其它slave就不會再去抓)還沒有運行過且沒有分配有slave的test fixture/case。

(3)ConsoleRunner,最開始的那個圖中沒有畫出來。這個console程式主要供Jenkins調用。Jenkins不是可以讓job定時運行嗎?正好,定時調用這個console application,傳幾個參數,就可以在指定時間往Queue裡填充fixture/case,然後再啟動ATService開始執行測試。這樣就能實現quick/daily/weekly/full regression的無人值守運行了。


4、Slave

我選擇在Windows上運行測試:

(1)公司IT一般只提供Windows作業系統的虛擬機器

(2)產品在Windows上的使用者占絕大多數(其實這個有點廢話,案頭作業系統Windows依然是世界王者。誠然,我自己業餘時用Linux做開發,Mac在國內外也是相當流行的,但GoogleAnalytics顯示的統計結果就是大部分訪問都來自Windows。什麼,你說iOS/Android?額……移動端現在仍然是產品的短板……)

如果選擇Linux的話要注意下selenium webdriver的native event設定(http://code.google.com/p/selenium/wiki/AdvancedUserInteractions#Native_events_versus_synthetic_events)。

關於瀏覽器,Firefox、Chrome、IE皆可,webdriver的瀏覽器安全色性已經很不錯了。瀏覽器安全色性是個有點頭疼的問題,想支援很多瀏覽器的話有時會增加很多開發、測試成本,我一般在Firefox上跑就足夠了。什嗎?數字?馬桶?企鵝?您想多了,selenium官方不支援。

你能找到多少台slave來執行測試?多多益善哦!找不到那麼多實體機就自己配虛擬機器吧,分布式運行可以給你的自動化測試生態系統裝上火箭!在更短的時間內運行完更多測試,從而更快地從測試中獲得反饋!


嗯,差不多就這麼多了。還有很多細節就留在之後的文中再說了。自我感覺這個生態系統還是有很多可以完善、增加的功能,而且這個實現方式、運作機制可能也並非適用於你所測試的產品,不過現在對於我測的產品來說是夠用的了。

不管怎樣實現,我想表達的核心觀點是:

做自動化測試不要局限於自動化測試代碼的編寫,我們要自動化的不僅僅是manual test case,還應包括整個automation test的process!測試代碼持續整合、部署(分發)、執行、結果展示,自動化的環節越多、越徹底,為你節約的時間就越多,你可以用這些節約的時間做更有意義的事情。人類發明電腦,用代碼編寫程式,其實就是一種自動化的過程。以前要靠手工勞動完成的現在都交給電腦做了——伺服器不正是勤勤懇懇地重複執行著我們寫好的程式嗎?構建自動化測試生態系統是同樣的道理,因為機器能比人更可靠地完成重複勞動。

如果你還在手動拷貝*.dll,還需要開啟NUnit手動執行測試,還在1台機器上運行測試,那麼,現在就是該提高生產力的時候了!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.