本篇承接于上篇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代码以下:编程
在MainPage Code-Behind执行数据绑定代码以下:windows
运行效果:浏览器
一个基础功能实现完成后.如今要对ViewModel中代码作基本的UT.安装完PEX以后直接右键点击能够看到以下操做选项Run Pex 和PEX:app
首先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:dom
能够把该DLL文件拷贝到一个独立的目录下并初始化路径:.ide
点击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自动修复.
那两者区别在哪呢?
其实这个问题上篇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事件:
能够看到在右栏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
能够看到在建立普通单元测试项目时找不到对应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浏览器中:
那针对 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 中实现的思路呢,这点正如园友sinodragon21在Windows 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找到:
建立完成手动添加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 Online Demo :http://pex4fun.com/
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
同类型的应用目前在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