加入RUN!PC粉絲團
最近新增的精選文章
 
最多人點閱的精選文章
 
 
精選文章 - 開發技術
分享到Plurk
分享到FaceBook
 
TFS 2012 實驗室管理(2)
文‧圖/胡百敬 2013/3/4 下午 03:19:31

在上期專欄中,我們說明了如何利用 TFS 2012/Visual Studio 2012 的實驗室管理功能建立「標準環境」。據以執行先前專欄「自動程式碼UI測試(上)、(下)」所建置的.NET測試。
若要透過 TFS 預設提供的方式,以完整的流程結合原始碼版本控管、自動化組建,而後再自動執行測試,則需要靠「團隊組建(team build)」。在本期專欄中,我們將整合團隊組建讓測試整合到自動化的開發流程中。

新增組建定義
首先,滑鼠右鍵點選Visual Studio的「Team總管」視窗內之「組建」節點,選擇「新增組建定義」選項,如圖 1 所示:


▲ 圖1:新增團隊組建定義


這將在左方帶出各種設定組建細節的編輯環境,透過「一般」頁籤設定名稱後,接著在「觸發程序」頁籤定義如何觸發組建流程,如圖2所示:


▲ 圖2:設定如何觸發對方案的建制流程


圖2的各項設定說明如下:
●手動 - 簽入不會觸發新組建:不會自動觸發組建,需小組成員手動將組建需求排入佇列,例如選擇圖1右方「Team Explorer – 組建」視窗中,滑鼠右鍵點選下方「所有組建定義」區塊中任一個組建定義,而後在快捷選單選擇「佇列新組建」選項,或是透過命令列工具程式 tfsbuild.exe,撰寫批次檔啟動組建。簡單的指令範例如下:
tfsbuild start /collection:http://tfs2012:8080/tfs/DefaultCollection /buildDefinition:\myTeamProject\mybuild
●連續整合 -建置每次簽入:若簽入的原始碼檔案是由此組建定義建置,則簽入變更時,自動將組建排入佇列。這種方式的好處是呈現哪幾次變更集(Changeset)導致建置失敗,可明確追蹤問題。缺點是在團隊開發多人同時簽入時(例如每天下班前),引發大量建置,但實際需要的可能是完整程式碼簽入後,才開始建置。
●正在復原組建 -累積簽入,直到前一次組建完成:若簽入的原始碼檔案是由此組建定義建置,則簽入變更時,有限制地將此組建排入佇列,換句話說,不一定會啟動組建。其限制是當此組建定義的流程已經在執行時,不會將新組建排入佇列。或是選取「建置最高頻率」核取方塊,並輸入介於 0 和 2147483647 之間的整數值,當作兩次組建中要等待的分鐘數。
●閘道簽入 - 只有在順利合併並建置提交的變更時,才接受簽入:將組建做為版控的簽入檔案之品質管制,避免簽入了會造成編譯失敗的原始碼。當開發人員簽入檔案時,該變更集會先放在TFS版控所提供的「擱置」區;形成「擱置集(shelveset) 」,建置伺服器會先與版控合併擱置集以進行建置,若建置成功,則自動將擱置集簽入,否則依然放在擱置集。因此,要將程式碼簽入時,會得到如圖3的提示:


▲ 圖3:簽入原始檔時被「閘道簽入」機制攔下,先進行建置流程


當建置在背景執行時,可以透過「Team總管」視窗叫出某個組建的監控視窗,以檢視進度報表。建置流程無誤地完成後,會彈出簽入的對話窗,如圖4所示:


▲ 圖4:當所有的建置流程完成後,會彈出簽入並協調工作區的對話窗


點選「協調」後,若你的Visual Studio工作區在組建的過程中沒有再持續撰寫該檔案,則相關的檔案會從簽出的狀態自動改成簽入的狀態。
為提高在「觸發程序」索引標籤中組件流程的效率,TFS 2012版本後可選擇「合併且建置,最多到 n 提交」 選項,其中 n 是你自己填入的值,指定同批次建置的最大簽入數量。可以使用此選項將多次簽入的版本一次做閘道簽入。若批次建置失敗,會自動改成針對每個簽入個別認可或拒絕。
例如,如果三個簽入在同一批次一起建置,但建置不成功,此系統佇列裡三個簽入會個別組建,組建成功的再個別簽入。
閘道簽入是TFS 2010版提供的功能,之前版本若要保證簽入的程式碼品質,可以在「原始檔控制」設定「簽入原則」:「組建」。這讓組建失敗後,下次就無法再簽入。因此再簽入新的程式碼時,「簽入原則」會提出錯誤警告,開發者一定會發現建置失敗的狀況,這時可覆寫原則,簽入已修改過之先前錯誤的新程式碼。

●排程 -每週於下列日子建置:建立組建排程。針對要執行組建的日子,選取核取方塊。於「在以下時間將組建排入預設組建代理程式的佇列」文字方塊中指定建置時間。
(註:在「約耳趣談軟體」一書的第十章「每日編譯是你的好朋友」中,建議你每日編譯最好選在中午吃飯的時間。如此,發現問題時,可以立刻在下午解決。若是在晚上自動建置,可能第二天來上班時,不記得導致錯誤的原因。)

以上會因為原始檔簽入而觸發的自動化組建,例如:「連續整合」、「正在復原組建」和「閘道簽入」等,其簽入造成觸發的單位都是團隊專案(Team Project)。換句話說,若你想要組建的是Visual Studio的某個方案A,但簽入的是Visual Studio另一個專案B,而這兩者隸屬於同一個團隊專案,則簽入專案B內的檔案依然會造成組建方案A。若是閘道簽入,則依然要方案A成功組建,專案B才能簽入。
接著是「工作區」頁籤,設定名為「工作資料夾」的表格,針對要建立組建定義的 Team 專案列出版本控制資料夾,並且將它們對應至組建代理程式上的本機資料夾,組建代理程式會利用此目錄存放原始碼與相關物件、編譯成果等。如圖5所示:


▲ 圖5:設定原始檔的「工作區」和組建的輸出位置


組建代理程式上的本機資料夾會出現在「組建代理程式資料夾」資料行內。可以利用 $(SourceDir) 關鍵字,將這些檔案下載至組建代理程式的「Sources」子目錄。這預設的路徑可以透過「Team Foundation Server管理主控台」工具程式的「組建組態」頁籤內;「控制器的代理程式」的「屬性」設定。
接下來在「組建預設值」頁籤要賦予一個檔案共享目錄:


▲ 圖6:設定存放組建結果的共享目錄


設定「將組建輸出複製到下列置放資料夾」所指定的網路共享目錄,若有多個組建代理程式在不同機器上,它們各自簽出原始碼並完成組建後,會將成果複製到這裡所指定檔案伺服器上的共享資料夾,並以子目錄名稱區別,故組建服務的帳號要有權限在該共享目錄建立子目錄和檔案。

接下來是設定以Workflow Foundation 4.0所設計的「流程」,讓建置的過程可以依序完成多項工作。在建立 Team 專案時,會自動將Windows Workflow的XAML格式流程範本放在原始檔控管;team專案目錄下的BuildProcessTemplates子目錄內。直接滑鼠雙擊「原始檔控制總管」內的流程範本,在Visual Studio檢視如圖7所示:


▲ 圖7:TFS 2012 預設提供的組建流程範本


你可以自行定義流程範本並放在原始檔控管下的任何位置,然後在「流程」頁籤選擇。透過預設的DefaultTemplate.11.1.xaml流程範本可提供的組建設定如圖8所示:


▲ 圖8:設定組建的流程


DefaultTemplate.11.1.xaml流程範本預設的流程框架與工作如表1所示:

▲ 表1:預設流程的框架步驟



在執行表1各項工作時,可搭配圖8所輸入的參數,完成客製化設定。在此僅選擇性地介紹圖8中較常用到的設定選項,詳細內容請參閱線上說明。

「必要項」設定
首先是指定想要建置的專案,在圖8表格上方展開「要建置的項目」節點,於「要建置的專案」方塊中,點選右方「...」按鈕叫出「方案/專案」對話方塊,選擇一或多個要建置的方案或專案。如果要建置許多相關的專案,通常會將它們加入至單一方案,然後在「要建置的專案」指定該方案,而非個別列出每個專案。若是輸入多個專案或方案,可以逗號分隔在版本控制上的完整路徑,例如:
$/myProjects/ProjectA/Server/All Server Projects.sln, $/myProjects/ProjectA/Client/All Client Projects.sln
而在「要建置的組態」方塊中,可選擇想要建置的平台和組態。例如,x86|Release藉以指定此組建應該只建置「32位元」版本的「發行」組態,或Any CPU|Debug以建置在任何平台上皆可以跑的除錯用組態。如果將此方塊保留空白,就會建置每個方案或專案定義中預設的組態和平台。
如果想要同時建置偵錯和發行組態,可指定 x86|Debug,Any CPU|Release,而清單中的多個組態必須以逗號分隔。編譯完畢後,可以在輸出目錄下看到多個子目錄,分別存放不同的編譯目的。
組建流程在建置完畢後,可以接著執行一個以上的自動化測試回合。並針對測試回合指定要執行的測試、執行測試的設定、測試失敗組建是否失敗等。

「基本」設定
若要將設定執行自動化測試,可展開圖24的「基本」節點。在「自動化測試」項目下選取執行測試的方法。若測試回合中的任何測試失敗就代表組建失敗,可選取「在測試失敗時使組建失敗」核取方塊。否則測試失敗會讓完成的組建被分類成「已部分成功」。
每次組建完成後,相關的產出都會放到新建的子目錄內,可以透過修改「組件編號格式」內容指定目錄名稱。預設值的巨集定義為:
$(BuildDefinitionName)_$(Date:yyyyMMdd)$(Rev:.r)
上述巨集分別代表:
$(組建定義的名稱)_$(組建的執行日期)$(每次在給定日期重複組建定義時就會遞增加一的整數)
$()包的是可動態取代的「語彙基元」,而你直接編寫的字元會成為名稱的一部份。直接點選「組件編號格式」右方的「…」按鈕;可以叫出「BuildNumber」格式編譯器,點選下方的「巨集」按鈕,就能選用想要的「語彙基元」,如圖9所示:


▲ 圖9:透過「語彙基元」指定「組建編號格式」


「進階」設定
若要指定組建可用的時間限制,可設定「代理程式設定」項目,然後指定以下參數:
●代理程式執行時間上限:允許組建代理程式處理組建的最大時間長度,以hh:mm:ss格式設定範圍值。例如指定04:00:00,而組建代理程式在4小時內未完成,則建置因逾時錯誤失敗。如果無限制時間,可指定00:00:00。
●代理程式保留等待時間上限:將組建指派至組建代理程式所允許的最大時間,以hh:mm:ss 格式輸入範圍值。例如指定01:00:00,而組建在 1 小時後仍未指派組建代理程式,則建置因逾時錯誤失敗。若不限制「組建控制器」發配此「組建定義」的「組建代理程式」之時間,可指定00:00:00。
「在失敗時建立工作項目」的預設設定為True,代表在建置失敗時會自動建立bug工作項目,但私用組建失敗不會建立工作項目。
如果須暫時停用測試,但不刪除測試回合,可設定「停用測試」為「True」。當想要重新啟用測試時,再將此值設回「False」。
「流程」設定完畢後,最後是設定「保留原則」,如圖10所示:


▲ 圖10:針對不同的建置結果,設定保留多少份紀錄,以及刪除建置結果時,要包含哪些項目


圖10的「指定組建的保留方式」清單中會顯示兩組保留原則,這將影響你在「Build總管」的「已完成」頁籤可追蹤的組建歷程記錄:
●已觸發和手動:設定手動或自動將組建排入佇列時,限制系統所要保留不同組建結果的記錄份數或刪除的資料。
●私用:手動將擱置集的原始碼排入組建佇列稱為私用。此處限制系統為「私用」組建所要保留份數或刪除的資料。
針對先前專欄撰寫的自動程式碼UI測試.NET專案建立好一般組建定義後,接下來再透過LabDefaultTemplate.11.xaml範本,建立使用上篇專欄所建置的「標準環境」執行自動化測試之組建定義。

使用LabDefaultTemplate範本建立組建定義
我們可以透過團隊組建於建置成功後,自動經由測試環境執行測試,並將結果反應在組建的報告中。
首先是新增一個使用LabDefaultTemplate範本組建定義。透過「Team 總管」滑鼠右鍵點選「組建」節點,選擇「新增組建定義」選項。參照前文的說明,在「流程」以前的頁籤都可以維持預設值。
在「流程」頁籤選擇預設的「LabDefaultTemplate.11.xaml」流程範本提供的組建設定,如圖11所示:


▲ 圖11:透過組建預設提供的LabDefaultTemplate.11.xaml流程範本,搭配測試虛擬環境,自動化「建置-部署-測試」


在「流程」頁籤上方的「建置流程檔」下拉選單預設提供之「LabDefaultTemplate.11.xaml」建置流程範本。而後回到「流程」頁籤,點選下方「建置流程參數」中的第一項「實驗室處理序設定」,叫出「實驗室工作流程參數」精靈,如圖12所示:


▲ 圖12:透過「實驗室工作流程參數」精靈設定自動化測試所要使用的實驗室環境


接著,在「環境」頁籤可以指定上篇專欄所建立的標準環境:


▲ 圖 13:於「環境」頁籤選擇先前建立的虛擬測試環境


圖13中可透過「環境名稱」下拉選單選擇先前在「測試管理員」之「實驗室中心」建立的測試環境。若是 SCVMM 虛擬環境,可再於「快照名稱」下拉選單選擇該環境的某份快照,則自動化測試流程開始時,會先將環境還原到該快照點,也就是一整組的虛擬機器各自從相同時間建立的快照集開始執行測試。在此,由於是「標準環境」,雖然我們也是採用虛擬機器,但由於缺乏 SCVMM 的輔助,所以無法設定快照。
接著在「組建」頁籤可以選擇另一個已經設好的組建定義,或是直接選擇放在建置共享目錄上的最新組建結果,如圖14所示:


▲ 圖14:設定啟動實驗室自動化的組建流程時,是否要先叫起另一個組建定義,以建置原始碼


在圖14上方的「組建」頁籤可以選擇要執行測試前,透過右上方「選取組建定義」下拉選單選擇另一份組建定義,以設定是否需要先從原始碼控管中簽出最新的版本,建立一份新的組建。換句話說,這個實驗室工作流程的組建本身並不做建置,而是呼叫 TFS 組建服務執行另一個負責建置的組建定義。
或是從存放各版組建的共享目錄取得某個版本,你可以選擇「將新組建放入佇列」或「選取現有組建」選項。若是選擇「選取現有組建」選項,則可以從下拉選單中選擇「最新」的組建版本,或是某個特定的版本。
決定待測程式版本後,在圖14下方的「部署」頁籤設定如何將測試相關的程式或資料部署到測試環境,你可以透過「命令提示字元」的 cmd Shell 批次指令執行部署,或是撰寫批次檔呼叫其他的腳本語言乃至於工具程式,以部署較為複雜的環境或測試資料。
最後,在「測試」頁籤選擇要自動執行測試計畫;及其內的測試套件,如圖15所示:


▲ 圖15:設定自動執行的測試「套件」與「自動化測試設定」


圖15的「選取測試計畫」、「選取測試套件」、「選取自動化測試設定」等選項是在「測試管理員」的「測試中心」所設定,須先建立測試「套件」以組織測試案例,並透過測試案例連接自動化測試(如:自動程式碼 UI 測試、單元測試、Web 效能測試…等)。在此只要選擇先前定義好的套件即可。
在此提醒一點,別忘了在「Test Manager」的「計劃」頁籤設定測試組態的組合中,要包含圖15在「選取測試組態」下拉選單中所選到的組態。在「Test Manager」的「計劃」頁籤設定測試組態的方式如圖16所示:


▲ 圖16:設定測試案例可用的測試組態


建立完使用實驗室環境的組建定義後,可以如同前文介紹的方式佇列新組建,而後可以觀察Test Agent在標準環境執行測試的狀況。最後結果會呈現在組件報告中,如圖17所示:


▲ 圖17:組建報告呈現測試執行結果


而這些測試案例的執行結果細節會存放到Team Foundation Server的資料庫內,你可以點選17下方的「檢視測試結果」連結,即可透過Test Manager檢視測試案例的執行歷程。
本篇專欄就介紹到此,在下篇專欄中,再繼續說明如何透過「Test Manager」的「實驗室中心」建立「SCVMM 環境」。