天天看點

Windows phone 應用開發[12]-Pex 建構自動化白盒測試[下]

本篇來探索一些Pex 在Windows phone Application應用程式中使用.

首先在Visual Studio 2010中建構一個Windows phone 應用程式BasicWinPhoneComponent_Demo.并實作一個簡單分類清單顯示.Well.定義一個标準的ViewModel執行資料綁定.   Viewmodel代碼如下:

1: public class MainPage_ViewModel:BasicViewModel 2: { 3: ObservableCollection<CatalogInfo> catalogInfoCol = newObservableCollection<CatalogInfo>(); 4: public ObservableCollection<CatalogInfo> CatalogInfoCol 5: { 6: get { return this.catalogInfoCol; } 7: set 8: { 9: this.catalogInfoCol = value; 10:base.NotifyPropertyChangedEventHandler("CatalogInfoCol"); 11: } 12: } 13:   14: public void LoadCatalogInfoDemoData() 15: { 16: this.catalogInfoCol.Clear(); 17: this.catalogInfoCol.Add(new CatalogInfo() { CatalogTitle="Music & Video",CatalogContent="Base Catalog Title" }); 18: this.catalogInfoCol.Add(new CatalogInfo() { CatalogTitle = "Book & Libray",CatalogContent="Basic Book" }); 19: } 20: }

.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }

在MainPage Code-Behind執行資料綁定代碼如下:

1: private MainPage_ViewModel mainPage_ViewModel = null; 2: void MainPage_Loaded(object sender, RoutedEventArgs e) 3: { 4: if (this.mainPage_ViewModel == null) 5: this.mainPage_ViewModel = new MainPage_ViewModel(); 6: this.mainPage_ViewModel.LoadCatalogInfoDemoData(); 7: this.DataContext = mainPage_ViewModel; 8: }

運作效果:

一個基礎功能實作完成後.現在要對ViewModel中代碼做基本的UT.安裝完PEX之後直接右鍵點選可以看到如下操作選項Run Pex 和PEX:

首先Run Pex即時生成測試用例 如果是安裝後.首次運作Run Pex 在Windows phone Application中.會提示:

該窗體提示選擇目前建構UT所基于的測試架構.PEX的擴充允許下載下傳并支援Nunit MBUnit、或Xunit.Net測試架構.目前根據官方說明PEX會自動檢測目前應用程式類型.根據不同應用會在測試架構選擇項中給出指定測試架構.當然針對Silverlight、Windows phone應用标準的還是Silverlight Unit Test FrameWork[SUTF]架構. 如果沒有安裝Silverlight Toolkit或是修改了預設的安裝目錄.這裡還需要手動指定目前架構安裝路徑.在前幾篇中提到SUTF  windows phone版本測試架構需要兩個核心的DLL:

1: //Silverlight Unit Test FrameWork For Windows phone Version DLL 2: Microsoft.Silverlight.Testing.dll 3: Microsoft.VisualStudio.QualityTools.UnitTesting.Silverlight.dll

可以把該DLL檔案拷貝到一個獨立的目錄下并初始化路徑:.

點選Ok 出現問題提示無法Assembly Microsoft.VisualStudio.QualityTools.UnitTesting.Silverlight.dll 這個DLL. 在目錄中删除掉該DLL.點選OK.

PEX 目前需要單獨解析DLL.需要重新指定Microsoft.VisualStudio.QualityTools.UnitTesting.Silverlight.dll檔案映射.PEX自動解析成功後 Run PEX在建立測試用例過程中出現異常:.

談到這個問題.這裡有必要解釋一下Run Pex和Pex->Create Parameterized Unit Test 兩種運作Pex方式之間的差別.如果獨立運作Run Pex 選項操作時我們能發現它沒有像Pex->Create Parameterized Unit Test 選項一樣,需要獨立建立一個單元測試項目.實作測試代碼與宿主源代碼之間的分離. 但當你執行Run Pex時你可以在Visual Studio 左下角狀态欄下.可以看到Run Pex時其實把建立這個單元測試項目交給Pex内部來做.這一方面能夠為測試用例建構驅動環境. 同時能夠實作在無需開發人員維護測試用例代碼情況下即時run Pex方式運作代碼塊的UT. 查找Bug并通過Pex自動修複.

那二者差別在哪呢?

那現在遇到什麼問題?

Event: "could not create an instance of BasicWinPhoneComponent_Demo.ViewModels.MainPage_ViewModel" Message: Click on 'Edit Factory', or, as a workaround, create a parameterized test that constructs the value from simpler values.

可以看到在建構單元測試用例時.無法建立MainPage_ViewModel執行個體.導緻整個Run Pex在建構測試用例驅動環境時中斷執行. 是否覺得上面步驟還不夠具體詳細. 因為我們始終在執行Run Pex時.不知道Pex内部是如何工作的? well.這時選中”Cound not Create an Instance …”測試Event事件:

可以看到在右欄Detail 下有一個Ignore操作.目的忽視目前錯誤繼續在Pex建立ViewModels執行個體.:

點開折疊的節點.可以清晰看到内部Pex在執行Run Pex時内部執行整個流程步驟.可以看到Run PEx 時PEx 内部執行流程如下:

Pex 執行流程: Create Pex Project –> Create Test Project –> Create Visual Studio Unit TEst Silverlight Project …

首先建立一個Pex Project. 在Pex Project基礎上建立一個普通的測試項目Test Project.其中這14操作中1-6步是用來建立測試項目.7-10是為目前測試項目添加建構測試用例驅動環境所需的引用.11-13步為目前測試項目添加指定的測試檔案,. 帶黃色長方塊即是要忽視的操作",執行:

需要基于一個獨立的測試項目來承載測試用例.建立:

:

當執行Ignore操作第四步Create ViualStudio Unit Test Silverlight Project時.出錯. 具體資訊如下:

Update result:  failed to generate project CSharp\Silverlight\Silverlight Unit Test Project.zip, Could not find template for new project
v0.92.50603.1, 06/07/2010 Highlights Preparable Types. It is possible to register a lazy setup method for a type. This method has to be static and will be invoked by Pex before any method of the given type is executed. This is a great way to mole parts of your system on demand.

可以看到在2010/7/6日版本更新的Realse Note中.提到這個版本已經支援Silverlight中運作Pex實作白盒自動化測試.Pex針對silverlight中.cs檔案,預設使用VisualStudioUnitTestSilverlight架構。[assembly: PexAssemblySettings(TestFramework = "VisualStudioUnitTestSilverlight")].很多在Silverlight 中做過Ut的同學應該知道.PEX會針對Silverlight應用程式會也會建立一個對應桌面版的Silverlight Project.而針對Silverlight Unit TEst FrameWork測試結果也會自動顯示Windows PC端的IE浏覽器中:

那針對 Windows Phone Application應用程式呢? 針對這個問題質詢官方Pex And Moles團隊對Windows phone支援的建議.得到回複如下:

"hi Peli: I am working on testing WP7 application. I found a very excellent tool "Silverlight Unit Test Framework" to do unit test. But, I want to do some automated tests for each function by inputting random data (like stress test). So, is there exist a tool like "Pex" can do stress test on WP7? Peli Reply: Hi kaichen, I am a developer from the Pex project. Unfortunately, Pex does not support Silverlight or Silverlight for Phone currently. We have no immediate plans to support this runtime in the short term. Cheers, Peli "

well. you see! Pex目前并不支援Windows phone 應用程式自動化白盒測試.

So.通過以上出現的問題.知道.Pex出現問題的地方在于.在Windows phone Application 中Run Pex時 Pex中并沒有一個支援Windows Phone的framework作為extension 内置模闆.導緻建立測試應用程式失敗.如果能夠Run Pex能夠在Silverlight和Windows phone 應用程式之間随意選擇切換.就更好了.

如果我們采用Pex自動化白盒測試工具.可以看到其實Pex的工作相對通過Windows phone Test Project模闆建立單元測試項目. Pex的目的主要在于通過參數化單元測試建構測試用例.而目前的問題在于.在建構這些測試用例驅動環境時無法建立對應Windows phone 測試項目. so. 如果二者能夠完美的結合.可以通過PEx自動探索分析代碼邏輯流,自動産生測試資料和單元測試用例。這時我們需要需要為Pex寫一個支援Windows Phone的framework作為extension(假定它叫做VisualStudioUnitTestWindowsPhoneSilverlight),在"Run Pex"時可以選擇該framework,最後生成XXX.Tests是Windows Phone工程,而不是PC版的silverlight工程.使其Pex通過SUTF測試結果能夠在Windows phone模拟器中輸出.

這時首先在Solution中添加一個Windows phone Test project 測試項目 命名為BuildCompontentDemo.Tests.該模闆可以通過在Online Template中搜尋Windows phone Test找到:

建立完成手動添加Silverlight unit Test Framework架構兩個核心DLL的引用:

well.這時找到源程式BasicWinPhoneCompontent_Demo.中ViewModel 通過Pex->Create Parameterized Unit Test 選項對應參數化測試用例.輸出把該用例代碼指定輸出到對應的剛剛建立的Windows phone TEst Project 上BuildCompontentDemo.Tests中來:

在Add New Test Project中可以看到Pex隻能建立自己内置模闆内對應Windows phone Test Project .而無法想普通測試的方式在建立測試用例後可以指定測試用例代碼輸出項目類似:

Pex并沒有暴露類似Visual Studio預設帶有測試架構可以指定測試用例輸出項目的的操作. so. 針對這個思路目前基于現有的Windows phone測試模闆還是一條Dead Way.問題還是在于Pex自身.

well.至此問題已經非常明朗.如果要在Windows phone 采用PEX自動化白盒工具建構單元測試.問題還是集中Pex自身.從開發者角度來說基本是無法行通的.至少從目前嘗試的角度沒有行通.當然也歡迎其他的園友有好的思路和想法均可以評論中提出.共同探讨實踐.但是作為開發者單一從使用工具的角度來說.這些工作并不适合尋求所謂的”突破”。因為官方在建構PEx版本時就沒有打算支援Windows Phone的運作時.而目前的問題多集中于Pex自身.是以這些工作應該官方官方團隊來做. 如果執意使用該工具.在我看來Pex所有帶來的自動化的簡便.遠大于解決目前問題付出代價要高,這樣的成本效益遠比另尋其他工具要來的簡便實在.

即使解決該問題.也難免在團隊協作推廣和使用過程遇到問題.光有流程和意識,而在實踐中缺乏必要可控方法是很難推廣和落地一項新技術的.當然這裡更沒有探讨所謂的成本,是以關于PEX在Windows phone自動化白盒測試推薦各位以嘗試探索的精神去解決.并不推薦在實際項目推廣應用.前提是解決該問題,但PEX在自動化白盒測試中設計理念還是值得深入了解的。

如上真實記錄Pex在Windows phone探索過程.

當然官方也給出一些關于PEX很有意思一個應用Pex4Fun:

Pex4Fun線上位址:

Pex4Fun這個應用是微軟研究院.推出一款Web通過C# /VB/F#語言線上程式設計.其實你也應該能看出來這裡用到Pex那一部分.Pex為何能夠自動化建立白盒的UT.最終一點就是PEX能夠完全自動地分析代碼行為,來決定相關的測試輸入.有了PEX作支撐這就不難了解這個線上編譯工具強大了吧.當然針對Pex4Fun也推出對應Windows phone 應用:

Pex4Fun For Windows phone:

同類型的應用目前在Windows phone平台很少見.原來我在檢視應用MSDN Library Reader就考慮到.如果能夠在手機應用C#多種語言實作随時随意寫Code.同時随時随頂在手機編譯運作.該多麼Cool.果不其然.Pex4Fun就做了這樣的工作.它類似2012年初微軟推出Visual Studio開發人員成就系統.可以線上寫代碼賺取積分進入排行榜.另外不得不說的是.裡面還有各種各樣的考題和考題對應的需求說明文檔.這對開發人員來說真的很不錯的一個應用.

Pex4Fun是目前唯一Pex在Windows phone以功能形式出現的應用.但我一直很疑惑該應用在使用Pex功能是如何實作的.? 如果是純用戶端意義.倒覺得意義不大.但該項目非開源.so并不知内部其實作過程.

關于Pex在Windows phone建構白盒自動化測試整個過程如上.如有疑問請在評論提出.

本文轉自chenkaiunion 51CTO部落格,原文連結:http://blog.51cto.com/chenkai/773871

繼續閱讀