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


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

本篇來探索一些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 = 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:       }

在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:          }

運行效果:

2012-01-21_112747

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

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:

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

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

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

那二者區別在哪呢?

其實這個問題上篇Windows phone 應用開發[11]-Pex 構建自動化白盒測試[上] 中Pex構建參數化單元測試中提到.只是沒有聯系到run Pex. Pex->Create Parameterized Unit Test 目的其實通過創建一個手寫的參數化單元測試,Pex完全自動地分析代碼,來決定相關的測試輸入。其結果就是生成一個有着高度代碼覆蓋的傳統單元測試.而Run Pex運行的Ut效果是即時.開發人員在無需維護測試代碼前提下就能看到當前代碼塊Ut測試結果. 其實二者內部的原理並無差異. Run Pex其實在內部創建一個代碼不可見的參數化單元測試項目在此基礎之上構建測試用例.多次執行而獲得即時測試結果.而Pex->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 –> Create Test Project –> 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->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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM