Spiga

Windows phone 应用开发[9]-单元测试

2012-01-06 22:11 by chenkai, 1382 visits, 收藏, 编辑

本篇来谈谈Windows phone Unit Test.

原来在9月份一次线下技术沙龙现场交流.我在现场提到关于Windows phone Unit Test在实际编程所体现一些问题.可惜当时在现场回应人的太少.通过本篇将详细梳理关于在Windows phone 开发流程做UT可能遇到的问题,以及一些具体解决方案.

关于UT.不会在这里拿太多篇幅解释它基本的用法.当然也更不会拿时间去强调UT它在实际编程中保证软件质量重要性.从自身角度来说.一个程序员良好的职业素养往往源自于对自身高要求,并能持之以恒的保持下去.在实际开发流程照成很多”不愉快“的体验,其实很多从自身角度来说完全可以避免的.

software_developer

其实很多Team在实际开发中拒绝写UT.而且还不在少数.依然还是很多开发人员认为自己只是不断贡献产品的Code.而和UT无关.还是有那么多Program Manager太过于专注开发进度.在每次CodeReview后.忽略了为UT留下相应的时间.而在后期集成测试阶段让开发人员陷入Bug突显修修补补“灾难”之中难以自拔. 显然实际开发中突显种种问题.是对理想状态下软件工程必要流程断章取义.而IDE开发工具越来越强大编译能力似乎让开发人员产生依赖.编译通过只是说明语法正确.而无法真实确认实际Code语义是否也是愿景一致.而在具有一定规模存在多分枝项目结构中.如果没有一个完整保证软件质量的体系和具体措施方法.很难想象这样集成项目中对开发人员该是一种什么样的灾难.!?

well.谈到Windows phone应用或是客户端.往往实际开发规模相对于Pc Application较小. 特别是未来突出云平台发展方向.必然会照成客户端APP越来越瘦的趋势.但必要测试依然是构造可靠应用程序必经之路.

<1>构建测试环境

针对Windows phone应用程序Unit Test 官方并没有在IDE提供对应的测试框架.经过实际开发反复验证.依然可以通过如下几种方式建立.Windows phone 单元测试.:

建立单元测试:

[1]通过带有官方背景的Jeff Wilcox’s 更新Silverlight Unit Test Framework的Windows phone版本建立单元测试.具体请参见Updated Silverlight Unit Test Framework bits for Windows Phone and Silverlight 3 And Unit Testing Silverlight & Windows Phone Applications

[2]通过第三方测试框架Windows phone Test FrameWorkNUnit For Windows phone 等构建

在目前Windows phone应用程序中建立单元测试框架中在开发者群体使用最广泛的是Jeff Wilcox’s 维护更新的Silverlight Unit TEst FrameWork For Windows phone版本.其实熟悉Silverlight开发的同学应该知道.Jeff Wilcox是Silverlight 2版本时官方推出Unti Test FrameWork单元测试框架的主要开发人员之一.做过Silverlight单元测试的开发人员肯定知道他曾在博客写的Silverlight 2版本单元测试系列.

在Windows phone应用程序中引用单元测试需要添加如下引用DLL:

 1: //添加引用DLL
 2: Microsoft.Silverlight.Testing
 3: Microsoft.VisualStudio.QualityTools.UnitTesting.Silverlight

可以通过两种方式获得该DLL引用.方式一在Jeff Wilcox’s 博客下载 解压即可:

[ZIP, 518K] Silverlight Unit Test Framework Assemblies compatible with Mango Beta Tools

下载完成后.解压能看到如上两个必须的DLL.这时解决方案添加一个普通的Windows phone Application项目.[UT测试结果需要在UI输出].手动添加如上两个DLL引用关系.这时会提示:

2012-01-04_180856

提示引用Silverlight类库.可以不理会提示直接点击是确定引用.

方式二: 打开Visual Studio 2011 找到Tool->Extension Manager .在Online Gallery选项中搜索:Windows phone Test Project 可以看到:

2012-01-05_192531

可以直接通过点击Download下载安装该项目模板.安装完成后新建Project就能看到 Test选项页下多了一个Windows phone Test Project模板:

2012-01-05_193307

新建一个测试项目命名Test project1[测试用].在执行编译前需要安装Nuget然后通过Tool->Library Package Manager->Package Manager Console窗口输入如下命令添加引用:

2012-01-05_194039

这时会在TestProject 1实际上会看到添加三个引用:

 1: //添加引用DLL 
 2: Microsoft.Silverlight.Testing 
 3: Microsoft.VisualStudio.QualityTools.UnitTesting.Silverlight
 4: SilverlightSerializer.WP7

注意.当建立玩这个模板项目TestProject1会提示通过Nuget工具执行如下命令行: Install-Package Silverlight.UnitTest 和 Install-Package WindowsPhoneEssentials.Testing执行两个指令 .在执行命令前前者因WP7SDK 更新的原因,前者并不支持Mango版本所以就不推荐使用了.一律使用后者命令初始化引用库.

构建好测试项目后.首先在Windows phone Unit TEst中.我们既可以采用极限编程XP提倡的[TDD]Test Driver Development测试驱动的方式从上而下进行.也可以仅仅只是回顾性的编写单元测试一遍验证代码的执行是否与预期的执行效果相同.本篇主要采用Silverlight Unit TEst FrameWork来构建执行WP7单元测试.

Well.在构建单元测试用例[Test Case]前.需要构建一个具有完成功能的Windows phone应用程序.这里为了演示的目的.当前应用程序以MVVM的方式实现UI上一个分类列表的显示.首先定义一个ViewModel-MainPage_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 LoadCatalogDefaultData()
 15:  {
 16:  this.catalogInfoCol.Clear();
 17:  this.catalogInfoCol.Add(new CatalogInfo() { CatalogName="Music & Video",CatalogComment="For Everyone Catalog" });
 18:  this.catalogInfoCol.Add(new CatalogInfo() { CatalogName = "Book References", CatalogComment = "just For Child" });
 19:  }
 20:  
 21:  public string catalogTitle;
 22:  public string CatalogTitle
 23:  {
 24:  get { return this.catalogTitle; }
 25:  set
 26:  {
 27:  this.catalogTitle = value;
 28:  base.NotifyPropertyChangedEventHandler("CatalogTitle");
 29:  }
 30:  }
 34:  }
 35:  
 36:  public class CatalogInfo
 37:  {
 38:  public string CatalogName{get;set;}
 39:  public string CatalogComment{get;set;}
 40:  }

这里定义一个ObserverCollection<T>来实现UI界面的绑定.数据源为了演示目的 采用静态添加集合方式.添加数据.建立号ViewModel 添加UI绑定:

 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.LoadCatalogDefaultData();
 7:  this.DataContext = mainPage_ViewModel;
 8:  }

在UI中添加一个ListBox呈现数据直接运行效果如下:

2012-01-06_110013

至此一个简单以MVVM形式构建分类列表显示功能Windows phone 应用程序构建完成了.在构建单元测试之前.原结构化编程语言中,比如C,要进行测试的单元一般是函数或子过程.但在目前的OOP面向对象的概念中,单元测试对应基本单位就是类.但是实际操作发现.类作为测试单位,复杂度高,可操作性较差,因此仍然主张以函数作为单元测试的测试单位,但可以用一个测试类来组织某个类的所有测试函数. 相对于Windows phone 应用程序以MVVM模型以及UIBind引擎中.核心代码更加倾向于集中ViewMolde和UI的Code-Behind中.因Silverlight Unit test FrameWork[SUTF]框架对单元测试具有可视化的输出.所以必须基于Windows phone Application模板.要在单元测试的项目构建测试用例前.需要初始化SUTF测试结果用户显示界面.

在测试项目中UnitiyCommonEmptyDemo.Test的MainPage 的Loaded事件中需要做如下几件事:

处理视图:

[1]隐藏SystemTray系统托盘

[2]处理应用程序的BackPress事件在SUTF中建立单元输出视图切换

[3]把当SUTF的测试结果输出当前UI中

实现如下:

 1:  void MainPageOutPut_Form_Loaded(object sender, RoutedEventArgs e)
 2:  {
 3:  //UnAvaliable SystemTray
 4:  SystemTray.IsVisible=false;
 5:  var currentMobileTestPage = UnitTestSystem.CreateTestPage() as IMobileTestPage;
 6:  if (currentMobileTestPage != null)
 7:  {
 8:  BackKeyPress += (x, se) => se.Cancel = currentMobileTestPage.NavigateBack();
 9:  (Application.Current.RootVisual as PhoneApplicationFrame).Content = currentMobileTestPage;
 10:  }
 11:  }

针对应用程序的功能.需要通过Unit TEst 验证CatalogInfoCol是否触发了PropertyChanged通知事件.绑定UI集合是否具有数据? 在修改CatalogTitle过程中是否正确传递属性的值?.

有了如上两个测试用例.针对对应MainpageUI建立MainPageTestHelper并表示类[TestClass]特性. 首先验证CatalogInfoCol是否触发通知事件.并在值发生变化集合中是否具有数据.建立第一个TEstCase:

 1:  [TestMethod]
 2:  public void DataColIsChanged_Test()
 3:  {
 4:  bool isPropertyChanged = false;
 5:  MainPage_ViewModel currentViewModel = new MainPage_ViewModel();
 6:  currentViewModel.PropertyChanged += (x, se) => 
 7:  {
 8:  if(currentViewModel.CatalogInfoCol.Count>0)
 9:  isPropertyChanged = true;
 10:  };
 11:  currentViewModel.CatalogInfoCol = new System.Collections.ObjectModel.ObservableCollection<CatalogInfo>() 
 12:  {
 13:  new CatalogInfo(){CatalogName="ComplateTestChanged",CatalogComment="TestData"}
 14:  };
 15:  Assert.IsTrue(isPropertyChanged);
 16:  }

当对ViewModel属性赋值触发PropertyChanged事件.并判断当前集合是否存在数据.同样.修改CatalogTitle看额外的修改是否正确传递属性对应的值,建立对应的Test Case 如下:

 1:  [TestMethod]
 2:  public void DataCatalogTitle_CatalogTitle_Test()
 3:  {
 4:  bool isEventChanged = false;
 5:  MainPage_ViewModel currentViewModel = new MainPage_ViewModel(); 
 6:  currentViewModel.PropertyChanged += (x, se) => 
 7:  {
 8:  if(currentViewModel.catalogTitle.Equals("newTitle"))
 9:  isEventChanged=true;
 10:  };
 11:  currentViewModel.CatalogTitle = "newTitle";
 12:  Assert.IsTrue(isEventChanged);
 13:  }

ok.编译通过。运行结果:

2012-01-06_1202092012-01-06_1202242012-01-06_120233

在SUTF中对应类和函数 测试结果之间具有一定层级关系.点击进入每个TestMethod具体的测试详情:

2012-01-06_135056

well.也可以写一个测试出错的函数来看看在出错是SUTF表现.添加TestCase 模拟出错的情况 添加如下Code:

 1:  [TestMethod]
 2:  [Description("This test always fails intentionally")]
 3:  public void AllwaysWrong()
 4:  {
 5:  Assert.IsTrue(false,"Test Method For Wrong Case!");
 6:  }

编译通过 运行:

2012-01-06_1355172012-01-06_1355252012-01-06_140737

带有红点是没有通过测试的类.单击类名可以找到类中带有TestMethod特性的方法列表.能在测试结果详情页看到对应TestMethod对应Description描述,测试的结果 运行时间和对应的异常信息.而能在异常信息中也能看到我们Code预先设置出错时会显示ExceptionMessage字符串提示.

如上在Windows phone application 构建一个最简单单元测试整个流程.

<2>异步操作

在Windows phone 应用开发中常常需要通过网络协议获取数据.或是通过异步操作实现常用UI更新等.这也是最为常见极为频繁的异步操作.其实做过Silverlight Application集成测试的同学应该知道这往往大量异步操作照成测试过程很多难易规避的问题.

和大多数单元测试框架不同.Silverlight Unit Test FrameWork整个单元测试框架是运行相同的线程上的.如果应用程序引用任何外部服务类似一个WCF Service都需要一个返回的UI线程的异步调用. 导致在UT同一线程执行时无法阻止当前线程等待WCF调用返回结果.UT无法做.

针对Windows phone Application应用程序. 如果想做集成测试基本不太可能.Silverlight Unit Test Framework 常常因为进程之间互操作出现任何未处理的异常都会中断整个集成测试的运行.而集成测试常常也需要长时间.跨越多线程操作的. 常常在运行时会出现异常后会自动跑到App.cs中Debugger.Break()方法中断整个程序执行立即退出.没有任何提示.而不是完全预期想UT测试返回Fail结果.

well.其实在Silverlight Unit Test Framework 框架对异步操作做UT完全可行的.只是存在一些测试用例中常常容易出错问题.出错频率较高.如上应用扩展一下.把ViewModel中集合通过异步方式获取数据源.

在独立封装UnitiyCommon 类库中定义CommentAPI类用来获取网络上数据.定义Code如下:

 1:  public delegate void CommentData(List<CommentInfo> commentList, Exception se);
 2:  public static event CommentData LoadCommentDataComplated;
 3:  
 4:  /// <summary>
 5:  /// This Method Simulate asynchronous request 
 6:  /// </summary>
 7:  /// <param name="uri">Request Download Image Uri</param>
 8:  public static void GetAllNewsCommentOperator(object uri)
 9:  {
 10:  if (!string.IsNullOrEmpty(uri.ToString()))
 11:  {
 12:  //Single Subscribe
 13:  LoadCommentDataComplated = null;
 14:  BasicAPI.TransportWebRequestOperator("POST", uri.ToString(), RequestComent_CallBack);
 15:  }
 16:  }

如上程序的目的通过一个指定的URI获取网络上图片数据.这个过程是异步的.封装类库中.要UI进行交互则使用最原始简单的委托+事件的组合方式.当图片数据下载完成通过LoadCommentDataComplated事件通知执行操作. 下载图片数据成功后.回调函数如下:

 1:  static void RequestComent_CallBack(IAsyncResult result)
 2:  {
 3:  try
 4:  {
 5:  HttpWebRequest currentRequest = result.AsyncState as HttpWebRequest;
 6:  WebResponse currentResponse = currentRequest.EndGetResponse(result);
 7:  if (currentResponse != null)
 8:  {
 9:  //Update State
 10:  IsComplated = true;
 11:  CommentInfo downloadComment = new CommentInfo()
 12:  {
 13:  CommentName = "Comment Image",
 14:  CommentImageUri=currentRequest.RequestUri.AbsoluteUri,
 15:  CommentImageData = currentResponse.GetResponseStream()
 16:  };
 18:  List<CommentInfo> commentList = new List<CommentInfo>(){downloadComment};
 19:  if (LoadCommentDataComplated != null)
 20:  LoadCommentDataComplated(commentList, null);
 21:  }
 
 23:  }
 24:  catch (Exception se)
 25:  {
 26:  if (LoadCommentDataComplated != null)
 27:  LoadCommentDataComplated(null, se);
 28:  }
 29:  }

回调函数手动处理数据.为了处理Unit Test单元测试.针对单元测试采用EnqueueCallback对象.需要额外添加如下Code:

 1: public static bool IsComplated { get; private set; }
 2: public void UpdateAsync()
 3: {
 4:  System.Threading.ThreadPool.QueueUserWorkItem(GetAllNewsCommentOperator);
 5: }

UpdateAsync方法的目的是通过Threadpool进程池的方式.在执行单元时调用.把所有的异步操作封装队列方式并稍后执行,.封装号CommentAPI后.通过ViewModel与UI进行关联.这里Code略去.详见源码.篇幅限制 不在赘述. 绑定UI后运行执行的结果如下:

2012-01-06_215219

如上其实我哪了一个最简单而最常见WebRequest异步请求方式获取网络数据.如何在Silverlight Unit Test FrameWork中对这种异步操作做单元测试?

其实原来Silverlight Unit Test FrameWork在第一个版本时并不支持对异步操作.后来确实太多开发人员发现很多核心的业务在异步中无法实现UT.Jeff Wilcox在后续版本增加对异步操作支持 .关于实现的过程Jeff Wilcox在其博客中有一篇Blog说的非常清楚:

Asynchronous Support For SUTF:
Asynchronous test support – Silverlight unit test framework and the UI thread

在Silverlight Unit Test Framework执行过程随着时间迁移执行如下:

ComparingExecution

从图中轻易发现SUTF框架要面临的问题,相对桌面Silverlight应用成不同的.SUTF要把可能在不同线程中异步调用操作.在时间轴能够以类似同步方式按照队列加以排序执行.关于这个执行规则组成.可以通过一系列UT中操作步骤完成. 那我们UT要完整测试一个异步调用 需要执行如下步骤:

异步测试需要执行的步骤:

[1]:首先通过线程池TheadPool把所有异步操作封装.在队列中随着时间轴线稍后执行.在UT中通过调用该方法开发异步调用

[2]:EnqueueCallback()方法添加一个任务到执行队列中.

[3]:EnqueueConditional()方法添加一个条件判断队列,如果为true才继续执行

[4]: EnqueueDelay() –添加指定的队列等待时间

[5]: EnqueueTestComplete() 添加一个TestComplete()到队列中,这个方法告知framework测试结束了

具体的执行流程如下:

WorkItemExample2

[如下章节.是在7份醉意下写的. 有些细节可能写的有些粗糙.]

梳理好了在测试框架中整个测试异步Begin-End模型流程.按照该流程执行.新建一个测试类MainPageAsyncTestHelper.首先针对异步测试需要引用常用的EnqueueCallback、EnqueueDelay等对象.该类需要继承Microsoft.Silverlight.Testing;空间下SilverlightTes类.以便引用,实现核心Code:

 1:  [TestClass]
 2:  public class MainPageAsyncTestHelper:SilverlightTest
 3:  {
 4:  [TestMethod]
 5:  [Asynchronous]
 6:  [Description("Test Async Operator .")]
 7:  [Timeout(6000)]
 8:  public void AsyncOperator_ViewModel_Test()
 9:  {
 10:  CommentAPI currentCommentAPI = new CommentAPI();
 11:  bool isAsnycComplated = false;
 12:  CommentAPI.LoadCommentDataComplated += (x, se) => 
 13:  {
 14:  isAsnycComplated = true;
 15:  }; 
 16:  
 17:  //Test Async 
 18:  EnqueueCallback(() => { currentCommentAPI.UpdateAsync(); });
 19:  EnqueueConditional(() => isAsnycComplated);
 20:  EnqueueCallback(() => Assert.IsFalse(CommentAPI.IsComplated));
 21:  EnqueueTestComplete(); 
 22:  }

在异步测试方法中.可选的特性项.针对异步操作测试方法必须添加[Asynchronous]标识.Description特性用来描述当前测试方法测试的功能简介描述.

而对于Timeout用意.大家都应该知道Begin-End异步模型中.如果建立网络请求可能导致请求超时情况发生.而且是服务器被动限制的.而在单元测试过程中.我们也不得不考虑当前单元测试可能会失败.可能在执行异步过程中会卡在一个无线循环或是类似请求的状态中.此类状态会使测试的执行耗费太长的时间.特别在执行集成测试中这种现象最为明显和常见.当然作为单元测试.尽量保证功能完整正确.特别在使用ASynchronous特性标识.如果在执行EnqueueConditional时从未使其条件语句为真.导致测试用例可能会被无限期锁住.当然为了是测试流程中避免出现中断测试或测试用例无法全部执行下去情况发生.Timeout特性为执行测试方法的时间提供一个上限值. 如果测试方法超过该时间则认定为失败.

Well.通过测试用例中.首先建立一个标识属性isAsnycComplated 用来标识当前异步操作是否完成.这是作为EnqueueCallBAck对象执行队列中必备的执行条件.首先通过UpdateAsync()方法启动异步方法. 再通过IsAsnyncComplated指定执行条件. Assert对齐进行排列.最后通过EnqueueComplete()方法来指示当前测试方法结束.

编译通过.测试结果:

2012-01-06_2150202012-01-06_2150322012-01-06_215037

异步测试通过.

<4>小结

本篇其实原不想写这么多篇幅.在Windows phone 中开始做Unit Test和集成测试也因传统的异步Begin-End模型会在实际操作出现很多异常.本篇目的是演示Windows phone 中做UT主要方式.以及处理这个过程自己碰到一些具体问题寻求的实际解决方案.抛砖引玉.但目前集成测试中一个解决方案是始终通过EnqueueCallback确保异常恰当地报告给单元测试框架。只要一个错误就能中断接下来的所有测试.而引起这个问题根源主要源于Windows phone很多操作异步模型导致.当然关于集成测试出错比较频繁的情况.国外一个作者Richard Szalay在其通过RX[Reactive Extensions]结合单元测试 给出一个处理解决方案. 这篇文章链接如下:

Richard Szalay 集成解决方案:

Writing asynchronous unit tests with Rx and the Silverlight Unit Testing Framework

在实际开发中其实我们项目中采用三种测试框架.Silverlight Unit Test Framework采用的最为广泛. 但SUTf依然存在很多限制和需要改善的地方。下篇将介绍通过其他第三方框架更简洁实现UT.并总结相对SUTF具有优势和特点.

关于本盘如果任何问题 请在评论中指出.

本篇所有演示的源码下载地址:/Files/chenkai/UnitiyCommonDirDemo.rar

参考资料:

Writing asynchronous unit tests with Rx and the Silverlight Unit Testing Framework

A Cheat Sheet for Unit Testing Silverlight Apps on Windows Phone 7

Asynchronous test support – Silverlight unit test framework and the UI thread
Running Windows Phone Unit Tests via MSBuild
Add your comment

20 条回复

  1. #1楼[楼主] chenkai      2012-01-06 22:14
    今天有些醉意.最后关于异步测试章节可能细节问题梳理不是很完整.我会在下篇关于单元测试第三方框架中加以说明.:)
     回复 引用 查看   
  2. #2楼 thankchunzi      2012-01-07 00:13
    @chenkai
    楼主的每一篇文章都很给力啊,一直在想怎么做单元测试呢,让我这个菜鸟学习不少。谢谢了
     回复 引用 查看   
  3. #3楼 施炯      2012-01-07 10:25
    强!
     回复 引用 查看   
  4. #4楼 Jake Lin      2012-01-07 10:55
    很详细的文章。我一直认为异步io不是ut的范畴。
     回复 引用 查看   
  5. #5楼[楼主] chenkai      2012-01-07 11:35
    @施炯
    @thankchunzi
    @Jake Lin
    :)
     回复 引用 查看   
  6. #6楼 sinodragon21      2012-01-18 11:03
    楼主雄文。
    写单元测试,楼主有没有尝试过微软的Pex自动化用例生成工具,我们在使用Pex的过程中遇到了些问题。

    希望楼主试试Pex and Moles,并写出另一篇雄文以飨读者。
     回复 引用 查看   
  7. #7楼 sinodragon21      2012-01-18 11:09
    楼主,再请教一个问题:业界常用code coverage评价Unit Test的质量,如果使用“Windows phone Test Project”模板,我们如何完成code coverage的统计?有什么好的方法?

    谢谢,:)
     回复 引用 查看   
  8. #8楼[楼主] chenkai      2012-01-18 11:48
    @sinodragon21
    all right!
    关于这个工具Pex and Moles 并没有用过.到时关于代码自动测试用生成使用可以VS集成的代码段工具Sinppet Editor.
    稍后会使用 根据情况看是否写一篇博文上来.
     回复 引用 查看   
  9. #9楼[楼主] chenkai      2012-01-18 11:53
    @sinodragon21
    其实关于Windows phone Unit Test官方承认并没有在IDE中提供任何可用单元测试框架. Silverlight Unit Test FrameWork是微软开发人员提供.但目前没有座位WP 单元测试框架以官方形式发布给开发者. 至于Code Coverage 代码测试覆盖率统计.在写这篇文章时并没有考虑. 一方面因为WP程序的规模远不及Pc端. UT的范围大大减小.

    支付单元测试覆盖率.WP程序中到时有一种可以监控的方式.尚未实践.我会做一些Demo.如果效果不错.有上传价值.会更新对应博文.
     回复 引用 查看   
  10. #10楼[楼主] chenkai      2012-01-18 14:20
    @sinodragon21
    well 关于你说的饿Pex and Moles 自动化测试.目前并不适用于Windows phone 应用程序.
     回复 引用 查看   
  11. #11楼 sinodragon21      2012-01-18 15:26
    谢谢楼主的热心帮助,已经看到你在StackOverflow上的提问了。
    Thanks a lot.
     回复 引用 查看   
  12. #12楼[楼主] chenkai      2012-01-18 15:49
    @sinodragon21
    关于这个问题我正在验证. 在2010年Pex realsenote 发现已经支持了Silverlight unit Test FrameWork .正在验证...
     回复 引用 查看   
  13. #13楼 sinodragon21      2012-01-18 17:01
    Silverlight unit Test FrameWork 貌似不能支持“WP7特有的类和API”的单元测试,如果程序中存在类似像“Microsoft.Devices.Environment.DeviceType”等这种WP7特有的类和API,该框架就会报类似以下错误:
    Message = "未能加载文件或程序集“Microsoft.Phone, Version=7.0.0.0, Culture=neutral, PublicKeyToken=24eec0d8c86cda1e”或它的某一个依赖项。The system cannot find the file specified."
     回复 引用 查看   
  14. #14楼[楼主] chenkai      2012-01-18 18:00
    @sinodragon21
    这个问题早就得到反馈了.
    这个是SUTF并不是官方的.难免不会出现这样的Bug,.所以现在SUTF能做的不能全面覆盖.针对性对业务流程或核心模块进行UT.
     回复 引用 查看   
  15. #15楼 sinodragon21      2012-01-19 09:39
    @chenkai
    Pex通过SUTF生成的工程是一个silverlight for windows版的工程,不是silverlight for windows phone版本的工程,所以不能做windows phone OS特有类和api的测试。如果pex能有一个可选的framework选项专供windows phone开发人员选择,那就太好了,可惜到目前为止还没有。
     回复 引用 查看   
  16. #16楼[楼主] chenkai      2012-01-19 10:40
    @sinodragon21
    Windows phone 依然缺乏好的测试框架.
     回复 引用 查看   
  17. #17楼[楼主] chenkai      2012-01-19 10:56
    @sinodragon21
    官方Realse Note:
    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 from http://silverlight.codeplex.com.
     回复 引用 查看   
  18. #18楼 sinodragon21      2012-01-19 11:36
    @chenkai
    如君所说。
    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.

    方法一:Pex + Silverlight 4 Toolkit.
    Pex针对.cs文件,默认使用VisualStudioUnitTestSilverlight框架。
    [assembly: PexAssemblySettings(TestFramework = "VisualStudioUnitTestSilverlight")]

    保存Pex的exploration,我们可以发现XXX.Tests工程是一个桌面版的Silverlight工程,把该XXX.Tests工程设定为Startup工程,run,测试结果显示在Windows PC的IE浏览器里,而不是显示在Windows Phone上面。

    方法二:下载安装并使用Windows Phone Test Project模板
    如果不用Pex,而是使用"Windows Phone Test Project"模板add project(该Template可以在"Add New Project"左侧选择Online Templates搜索安装后获得),该project是一个Windows Phone工程,包含WMAppManifest.xml, MainPage.xaml等,run,会启动WP7 emulator或者device,测试结果显示在WP7 emulator或者device上面。

    方法一
    缺点:不能测试Windows Phone OS特有的类和API,例如:Microsoft.Devices.Environment.DeviceType等。
    优点:可以自动探索分析代码逻辑流,自动产生测试数据和单元测试用例。
    ** 需求:需要为Pex写一个支持Windows Phone的framework作为extension(假定它叫做VisualStudioUnitTestWindowsPhoneSilverlight),在"Run Pex"时可以选择该framework,最后生成XXX.Tests是Windows Phone工程,而不是PC版的silverlight工程。

    方法二
    优点:可以测试Windows Phone OS特有的类和API,例如:Microsoft.Devices.Environment.DeviceType等。
    缺点:不能像Pex那样自动产生单元测试用例。
     回复 引用 查看   
  19. #19楼[楼主] chenkai      2012-01-19 12:02
    @sinodragon21
    我测试一下建立一个空的Windows phone Application 写了一个处理字符串方法用来测试.右键点击RunPex 弹出一个对话框默认选择的就是Silverlight Unit TEst Framework测试框架. 添加DLL映射目录.在Windows phone UT测试需要两个核心的DLL 分别是:Microsoft.Silverlight.Testing.dll和Microsoft.VisualStudio.QualityTools.UnitTesting.Silverlight.dll
    但是在执行加载时提示后者也就是QualityTools这个DLL无法加载.删除掉该DLL 通过.运行时提示“Could Found Any Test To Run” 如此无果.

    另你说着哎上面可以测试WP OS特有的类是通过如果PEx 建立一个Windows phone Test Project类型方式实现? 还是直接添加new Windows phone Test Project?
    对于PEx 我在Windows phone Ut验证上事失败的.
     回复 引用 查看   
  20. #20楼 sinodragon21      2012-01-19 12:57
    关于方法一,我发给你一封邮件,请查收附件。
    方法二和你本篇博文中描述的方法基本一样。

    我现在的work around就是把方法一和方法二嫁接在一起。
    先借方法一,用pex自动生成用例,然后把XXXTest.cs文件copy到方法二生成的project中去,结合完成。

    -_-||

    ** 需求:需要为Pex写一个支持Windows Phone的framework作为extension(假定它叫做VisualStudioUnitTestWindowsPhoneSilverlight),在"Run Pex"时可以选择该framework,最后生成XXX.Tests是Windows Phone工程,而不是PC版的silverlight工程。
     回复 引用 查看   
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 2315214 NGe6WyIXXr0=
无觅相关文章插件,快速提升流量