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

本篇承接於上篇Windows phone 應用開發[11]-Pex 構建自動化白盒測試[上] .大概瞭解Pex做爲自動化白盒測試工具工做方式.以及提出參數化單元測試的概念.爲開發人員減小手動編寫大量獨立路徑下單元測試時間.Pex容許開發人員編寫單獨的參數化測試方法,並根據測試方法的邏輯分支自動生成測試數據及Assert語句。雖然開發人員仍是須要手動編寫單元測試,可是Pex能夠確保對代碼進行了充分的測試.並能經過Pex自動修復Bug.添加測試項目.其中的Moles組件可用於模擬框架中包括靜態成員在內的幾乎全部成員,大幅提升了對測試的支持程度.html

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

首先在Visual Studio 2010中構建一個Windows phone 應用程序BasicWinPhoneComponent_Demo.並實現一個簡單分類列表顯示.Well.定義一個標準的ViewModel執行數據綁定.   Viewmodel代碼以下:編程

1: public class MainPage_ViewModel:BasicViewModel 2: { 3: ObservableCollection<CatalogInfo> catalogInfoCol = new ObservableCollection<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執行數據綁定代碼以下:windows

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: }
.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; }

運行效果:瀏覽器

2012-01-21_112747

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

2012-01-19_152753

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

2012-01-19_100304

該窗體提示選擇當前構建UT所基於的測試框架.PEX的擴展容許下載並支持Nunit MBUnit、或Xunit.Net測試框架.當前根據官方說明PEX會自動檢測當前應用程序類型.根據不一樣應用會在測試框架選擇項中給出指定測試框架.固然針對Silverlight、Windows phone應用標準的仍是Silverlight Unit Test FrameWork[SUTF]框架. 若是沒有安裝Silverlight Toolkit或是修改了默認的安裝目錄.這裏還須要手動指定當前框架安裝路徑.在前幾篇中提到SUTF  windows phone版本測試框架須要兩個核心的DLL:dom

1: //Silverlight Unit Test FrameWork For Windows phone Version DLL 2: Microsoft.Silverlight.Testing.dll 3: Microsoft.VisualStudio.QualityTools.UnitTesting.Silverlight.dll
.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; }

能夠把該DLL文件拷貝到一個獨立的目錄下並初始化路徑:.ide

2012-01-19_105212

點擊Ok 出現問題提示沒法Assembly Microsoft.VisualStudio.QualityTools.UnitTesting.Silverlight.dll 這個DLL. 在目錄中刪除掉該DLL.點擊OK.工具

2012-01-21_121337

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

2012-01-29_100545

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

那兩者區別在哪呢?

其實這個問題上篇Windows phone 應用開發[11]-Pex 構建自動化白盒測試[上] 中Pex構建參數化單元測試中提到.只是沒有聯繫到run Pex. Pex-&gt;Create Parameterized Unit Test 目的其實經過建立一個手寫的參數化單元測試,Pex徹底自動地分析代碼,來決定相關的測試輸入。其結果就是生成一個有着高度代碼覆蓋的傳統單元測試.而Run Pex運行的Ut效果是即時.開發人員在無需維護測試代碼前提下就能看到當前代碼塊Ut測試結果. 其實兩者內部的原理並沒有差別. Run Pex其實在內部建立一個代碼不可見的參數化單元測試項目在此基礎之上構建測試用例.屢次執行而得到即時測試結果.而Pex-&gt;Create Parameterized Unit Test 則可見的把當前測試代碼放到當前解決方案中.

那如今遇到什麼問題?

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事件:

2012-01-29_105525

能夠看到在右欄Detail 下有一個Ignore操做.目的忽視當前錯誤繼續在Pex建立ViewModels實例.:

2012-01-29_110034

點開摺疊的節點.能夠清晰看到內部Pex在執行Run Pex時內部執行整個流程步驟.能夠看到Run PEx 時PEx 內部執行流程以下:

Pex 執行流程:

Create Pex Project –&gt; Create Test Project –&gt; Create Visual Studio Unit TEst Silverlight Project …

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

2012-01-29_110524

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

2012-01-29_110646:

當執行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

能夠看到在建立普通單元測試項目時找不到對應Silverlight unit Test Framework Windows phone模板.well.這是查看Pex And Moles官方Realse Note記錄,針對這個模板支持的問題能夠找到以下說明:

v0.92.50603.1, 06/07/2010
  • Highlights
    • Rex integrates Pex. Rex is a tool that explores regular expression. It's algorithms have been integrated into the whitebox exploration engine of Pex. As a result, Pex is much smarter about generating strings that match a Regex.IsMatch call.
    • 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.
    • Silverlight and Silverlight for Windows Phone support (Alpha). Right-click on any Silverlight project and hit 'Run Pex'. Pex will run your Silverlight code on the desktop CLR and start generating tests for it. The unit tests can be executed using the Silverlight unit test framework fromhttp://silverlight.codeplex.com.

能夠看到在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瀏覽器中:

圖片1

那針對 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).

There is a tool called "Pex" (http://research.microsoft.com/en-us/projects/pex/ ) that can do that things for me, but it seems not support WP7 right now.

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.

You can post other questions on Pex at: http://social.msdn.microsoft.com/Forums/en-US/pex/threads/.

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 應用程序之間隨意選擇切換.就更好了.

Windows phone 應用開發[9]-單元測試中我提到採用默認的Visual Studio Test框架能夠在創建測試用例完成後 指定測試用例輸出的應用程序. 這是否可以提供一種解決Pex在Windows phone 中實現的思路呢,這點正如園友sinodragon21Windows phone應用開發[9]-單元測試評論中提出想法一致:

若是咱們採用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找到:

2012-01-29_141506

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

2012-01-29_141818

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

2012-01-29_114244

在Add New Test Project中能夠看到Pex只能建立本身內置模板內對應Windows phone Test Project .而沒法想普通測試的方式在創建測試用例後能夠指定測試用例代碼輸出項目相似:

2012-01-19_142616

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 Online Demo :http://pex4fun.com/

2012-01-29_161912

Pex4Fun這個應用是微軟研究院.推出一款Web經過C# /VB/F#語言在線編程.其實你也應該能看出來這裏用到Pex那一部分.Pex爲什麼可以自動化創建白盒的UT.最終一點就是PEX可以徹底自動地分析代碼行爲,來決定相關的測試輸入.有了PEX做支撐這就不難理解這個在線編譯工具強大了吧.固然針對Pex4Fun也推出對應Windows phone 應用:

Pex4Fun For Windows phone:

Pex4Fun :http://www.windowsphone.com/en-US/apps/db980958-7c4a-e011-854c-00237de2db9e

2fa104fe-26a2-416f-8d7c-67336dd2f46c779ae31b-6675-47d1-8f79-0b7e6ea37f000017871e-dd1b-4553-a98a-0b94e6d34636

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

Pex4Fun是目前惟一Pex在Windows phone以功能形式出現的應用.但我一直很疑惑該應用在使用Pex功能是如何實現的.? 若是是純客戶端意義.倒以爲意義不大.但該項目非開源.so並不知內部其實現過程.

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

本篇演示的源代碼下載地址:/Files/chenkai/BasicWinPhoneComponent_Demo.rar

相關文章
相關標籤/搜索