#眉標=TFS2010、mstest、tcm #副標=協同式軟體開發與品質控管(4) #大標=透過Test Manager建置自動化測試 #作者=文/圖 胡百敬 ========<反灰>=============== MSTest /testcontainer:"myTest\bin\debug\myTest.dll" /category:"Web|CodedUI" ======================= ========<反灰>=============== MSTest /testmetadata:TestDemo.vsmdi /testlist:UnitTest /publish:"http://nbi7:8080/tfs/DefaultCollection" /publishbuild:"TestDemo_20101207.4" /teamproject:myProject /platform:Any /flavor:debug ======================= ========程式1 =============== class Program { static string strTfsServer = "nbi7"; static string strTfsCollection = "http://"+ strTfsServer +":8080/tfs/defaultcollection"; const string strTeamProjectName = "myProject"; // Build 名稱要一直更換 static string strBuildName = "FakeBuild_" + DateTime.Now.ToString("yyyyMMdd_HHmmss"); const string strDefinitionName = "FakeDefinition2"; static void Main(string[] args) { AddBuild(strTfsCollection, strTeamProjectName,strBuildName ); Console.WriteLine( strBuildName + "新增 Build 完成 \n 按任意建繼續..." ); Console.ReadLine(); } static void AddBuild(String serverName, String teamProject, String buildNumber) { //取得TeamFoundation Server TfsTeamProjectCollection collection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri(serverName)); // 取得 Build Server IBuildServer buildServer = (IBuildServer)collection.GetService(typeof(IBuildServer)); //建立假的組建定義 IBuildDefinition definition = AddDefinition(buildServer, teamProject, strDefinitionName); //建立組件細節物件 IBuildDetail buildDetail = definition.CreateManualBuild(buildNumber); //建立platform/flavor 資訊,測試結果可依此發佈 IBuildProjectNode buildProjectNode = InformationNodeConverters.AddBuildProjectNode( buildDetail.Information, DateTime.Now, "Debug", "Dummy.sln", "x86", @"$/myProject/TestDemo/Dummy.sln", DateTime.Now, "default"); buildProjectNode.Save(); //藉由設定狀態為 succeeded 完成組建 //這個呼叫也會設定組建的完成時間 buildDetail.FinalizeStatus(BuildStatus.Succeeded); } private static IBuildDefinition AddDefinition(IBuildServer buildServer, string teamProject, string definitionName) { try { //如果先前同名的組件定義已經存在,就直接回傳該定義 return buildServer.GetBuildDefinition(teamProject, definitionName); } catch (BuildDefinitionNotFoundException) { //沒有發現同名組建定義,所以繼續執行,嘗試建立一個組建定義 } //使用第一個組建控制器當作這些組建的控制器 IBuildController controller = AddBuildController(buildServer, "fakeMachine", "fakeController"); //取得 Upgrade 範本當作流程範本 //IProcessTemplate processTemplate = buildServer.QueryProcessTemplates(teamProject, new ProcessTemplateType[] { ProcessTemplateType.Upgrade })[0]; //取得可用的範本即可 IProcessTemplate processTemplate = buildServer.QueryProcessTemplates(teamProject)[0]; //賦予假的組建定義所需資料 IBuildDefinition definition = buildServer.CreateBuildDefinition(teamProject); definition.Name = definitionName; definition.ContinuousIntegrationType = ContinuousIntegrationType.None; definition.BuildController = controller; //賦予真的有存放組建結果的組件/檔案之共享目錄 definition.DefaultDropLocation = @"\\MySharedMachine\drops\"; definition.Description = "假的組建定義,以建立假的組建結果"; definition.Enabled = false; definition.Workspace.AddMapping("$/", "c:\\fake", WorkspaceMappingType.Map); definition.Process = processTemplate; definition.Save(); return definition; } private static IBuildController AddBuildController(IBuildServer buildServer, string machineName, string controllerName) { //取得組建服務與控制器 IBuildServiceHost serviceHost=null; IBuildController controller=null; try { serviceHost = buildServer.CreateBuildServiceHost(machineName, new Uri("http://noservice:8888/")); serviceHost.Save(); controller = serviceHost.CreateBuildController(controllerName); controller.Save(); } catch (BuildServiceHostAlreadyExistsException) { //若已經存在 Build Services 就不需要註冊了 serviceHost = buildServer.GetBuildServiceHost(strTfsServer); controller = serviceHost.Controller; } return controller; } } ======================= ======註 ============ 1. MTM建立的「測試專案」與Visual Studio建立以.NET語法開發的「測試專案」不同,MTM的「測試專案」管的是測試案例、測試環境、追蹤測試結果…等中繼資料。Visual Studio的「測試專案」則是以.NET語法或XML定義;開發單元測試、Web校能測試等。 2. 也就是不由測試人員叫起Test Runner,按照測試步驟手動一步步執行,而是測試代理程式執行某些組建,或是按照某些測試類型的XML描述自動完成測試。 3. 依TFS採用的Team專案範本不同,MTM測試專案的「需求」所對應之「工作項目」類型也不同,若是預設的Agile範本專案,指的是「使用者本文」工作項目;在CMMI範本專案就是「需求」工作項目。 ==================