代码改变世界

Windows phone 应用开发[12]-Pex 构建自动化白盒测试[下]

2012-01-29 16:42  chenkai  阅读(1922)  评论(7编辑  收藏  举报

本篇承接于上篇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

无觅相关文章插件,快速提升流量