最近这段时间一直很忙, 上次关于Jacklin提出WindowsPhone 7访问本地DataBase在XAP包无法操作问题. 我正在WP7上测试利用开源数据库DB4O和SiaqoDB方式来解决这个问题.关于这篇验证文章晚些时候会把验证的相关原理,代码以及验证中发现的问题整理出一篇文章 发出来.

本篇来说说关于Silverlight测试——利用Ranorex工具实现TestDataDriver[TDD-数据驱动测试俗称黑盒测试].

Silverlight 在从1.1版本过渡出来后到Silverlight 2 可以在很多方面做了极大的改善. 特别是整个Silverlight框架搭建已经日趋完整面向多种变化需求. 相对以前SL版本微软第一次加入了单元测试框架.[Silverlight Unit TestFrameWork]. 直到今天再次历经 2个版本[Silverlighti 3/4]的更新和维护, 针对Silverlight Application Unit Test.在第四个版本已经能够轻松做到Unit Test.

谈到测试 对于开发人员. 应该了解和我们日常编程息息相关的测试: Unit Test[单元测试] 和 DataDriver Test[TDD] TDD是敏捷的实现方式XP[极限编程]的重要组成部分, 目前Visual Studio中对Unit Test支持.下图显示了Visual Studio 2010中提供的帮助测试客户的各种解决方案:

在Mix10大会中微软发布了Silverlight 4版本. 但是关注测试这块依然是一个让广大DVp开发者头大的问题. 微软4月份更新的工具包Arp版本就已经包含了Unit Test测试框架.运行在VS2010中,但是目前这个Test unit FrameWork框框架不能VisualStudio功能相集成.Team Foundation Server的2010与Silverlight单元测试整合也存在相关问题.  因为在测试这块发现足多很多不实际问题. 微软也是感到有些气短 在一次发言专门提到": 如下原文:

The recommended way for developers to run tests of their Silverlight applications is by building and running the test application. Visual Studio has a separate set of integrated test tools that are not connected to the Silverlight Unit Test Framework, which is the same for all previous releases of the Silverlight testing work.

 

 

<2.1>了解TDD测试

TDD缩写是Test Driver Development 是XP编程中一个非常重要组成部分.

严格意义来说真正和程序员编码有限测试应该UnitTEst 单元测试. 程序员有责任编写功能代码,同时也就有责任为自己的代码编写单元测试.  最终交互时 我们不仅要交互功能代码 还要交付这些相关功能代码的Unit Test.

Unit TEst面对的对象是程序员. 这样一来程序员就知道测试对象某一个实现Function函数中功能结构特点. 来进行编写用例. 就是所谓的白盒测试.白盒测试针对程序的逻辑结构设计测试用例,用逻辑覆盖率来衡量测试的完整性

而TDD的特点针对的对象是和代码业务无法的测试人员. 当我们把一个Silverlight Application交给测试MM时 她对软件中涉及的功能结构是未知的, 这时测试案例好坏我觉得不仅用的合适测试方法 而且和个人的经验又有极大关系. 在程序接口录入信息.根据定义测试规格输出相关信息. 而其中程序操作规则是已经制定好的. 其实这就是黑盒测试.黑盒测试着眼于程序外部结构,不考虑内部逻辑结构,主要针对软件界面和软件功能进行测试。

<2.2>关于Ranorex工具

本篇中对Silverlight测试工具选择采用的是Ranorex,目前对于有些老牌的测试工具只支持GUI元素的.而对于Web页面承载的Silverlight 的UI元素不识别. 而Ranoex则支持WinFrom/Flash/Flex/WPF/IE FF Web2.0/Silverlight。另外一个特点时Ranorex小巧 测试脚本完全支持C# VB.NET、Python多种语言.对。NEtFramework 版本支持已经到 4.0. 这为我们程序员编写Automatic Test Scirpt提供很大的方便.关于本工具信息:

Ranorex Web Site:-[官方站点]

Ranorex UserGuid Sample[用户指导案例 很详细关于测试各个方面 建议参考]

Rannorex Download Link [下载连接-Version:2.3.4-30天试用版]

Ranorex Genyen Key Tool[30天试用版破解工具下载]

当然在找到Ranorex工具前 我还有幸试用一个测试霸王版的TestComplete,确实一个测试工具霸王版本:

看到这个TestComplete简介我就想起打包工具中installshield霸王大哥一般. 面对两个篇幅的配置信息 我基本就已经 提前到下.来看一下TestComplete霸王特点:

TestComplete是一个自动测试管理工具,完全支持项目层级(project level)的单元测试、功能测试、回归测试(regression testing)、分布式测试以及HTTP性能测试。它是专门为应用程序开发人员和测试人员设计的。从开发代码、发布到维护的整个过程 .

对于Silverlight测试已经覆盖了目前的所有版本 以及。NetFrameWork支持也覆盖所有版本.

天啊.TestComplete是一个霸王测试工具不是没有道理 不费上一天两天的功夫去了解短时间内你是玩转不起来的. 所以我因为这个特点就抛弃了霸王的TestComplete 转而投向Ranorex小巧温柔的怀抱/

更多关于TEStComplate Web Site[官方站点]

<3.1>新建一个C# Automation Solution

对工具Ranorex安装完成后 你可以采用破解工具进行破解. 完成后启动Ranorex.进入主界面:

这块工具基本和VisualStudio基本类似.对于.NEt程序员来说运用并不难. 在左上角点击“File”——>”NEW”——>”Soluction”:从打开页面可以看出Ranorex工具支持C# VB.NET、Python三种语言编写脚本同时还支持WorkFlow工作流. 选择C#节点 并选中 C# For Automatic项目:

创建一个Ranorex C# Test Automatic项目命名为:SLAutomaticDemo:窗体分布

创建一个C# Automatic项目后 看一下项目结构:

Program.CS文件是C#语言编写的测试脚本文件.也是整个项目的入口处Main方法所在类. 另外一个很重要的文件Recording1文件则记录录制SL界面操作元素事件并自动转换成可操作的C#代码. 从Program.CS文件Main方法可以看出. 主程序就是调用Recording1文件中的Recording1类Start方法来实现脚本的自动化执行的.Program.cs 代码:

 
  
  1. public static int Main(string[] args)   
  2. {   
  3. Keyboard.AbortKey = System.Windows.Forms.Keys.Pause;   
  4. int error = 0;   
  5. string logFileName = "Test.rxlog";   
  6. Report.Setup(ReportLevel.Info, logFileName, true);   
  7. try   
  8. {   
  9. //调用Recording1文件中REcording类Start()执行对脚本的调用.很简单.   
  10. Recording1.Start();   
  11. }   
  12. catch (ImageNotFoundException e)   
  13. {   
  14. Report.Error(e.ToString());   
  15. Report.LogData(ReportLevel.Error, "Image not found", e.Feature);   
  16. Report.LogData(ReportLevel.Error, "Searched image", e.Image);   
  17. error = -1;   
  18. }   

当然在录制我们需要一个测试的Silverlight Application. 为了达到演示目的该Silverlight应用程序界面实现但是一个加法操作: 界面如下:

新建一个Silverlight Application即可. 输入第一个数和第二个数 点击计算按钮就把二者计算结果显示在最后一个文本框. 这是页面操作一个过程.分解成Reaorex录制步骤分为 TextBox1获得焦点——>输入第一个数——>第二个文本框获得焦点——>输入数字 ——>点击计算按钮 ——>显示数据 既然搞清我们要录制固定Silverlight 界面UI操作具体步骤 ,下一步就是利用Ranorex工具进行录制这个动作整个过程点击ReCord按钮 Ranoex工具就会最小化 右下角就出现一个记录窗体:

在这有人要困惑的问.为何要录制这个页面计算过程?

做过黑盒测试驱动编程朋友应该都熟悉. 当我们把已经完成功能代码的程序交给测试MM时 她是不知道内部的代码结构. 如何能测试出界面和功能性上Bug. 测试MM负责不断录入变化数据 而根据测试案例中编写的测试规格来查看输出结果 来判定程序是否存在Bug.

你明白了吧. 既然测试过程数据时不断变化的 我们现在要做的就是利用Ranorex工具录制测试案例不变测试规则.

当我们打开录制时就可以在已经运行成功页面进行上面拆分步骤进行操作.: 录制完成后即可点击Stop终止录制过程,. 

当把Silverlight页面三步计算操作录制完成 我们看一下Ranorex工具对页面事件操作的记录:

录制Silverlight 页面UI元素流程:

查看计录Silverlight UI元素的窗体记录:

根节点是承载页面WebFrom对应承载的Silverlight comtrol UI元素 分别涉及到四个 三个TExtBox和一个Button按钮.和我们操作步骤记录完全吻合.

录制好Silverlight页面UI元素的操作规则后 我们工作基本完成一半.

<3.2>编辑录制行为

当完成UI元素操作规则录制后. 下一步只需要利用Ranorex工具编辑录制中行为变成动态在C#语言中可运用的代码属性 供我们操作.

可以对Silverlight事件窗体做简单的操作就可把我们记录转换成编码中可操作的DataDriver: 选中我们在TextBox1/2页面输入操作keySequence :

选中Key Sequence右键点击——>Convert to User Code Item 后查看Recording1文件一下源代码:

源码中添加两个属性:

 
  
  1. // Create a new property 'FirstNum'    
  2. public static string FirstNum    
  3. {   
  4. get;set;    
  5. }    
  6.  
  7. // Create a new property 'LastNum'    
  8. public static string SecondNum    
  9. {    
  10. get;set;    

你应该明白这个属性封装但是我们在录制规则中对TextBox1和TextBox2的值. 当我们把一个key Sequences利用Ranorex工具Convert user Code 在右边属性窗体设置属性生成方法:

同理设置SecondNum属性的方法 发现源码中生成代码:

 
  
  1. public static void SetFirstnum()   
  2. {   
  3.  //Your code here. Code inside this method will not be changed by the code generator.   
  4.  Report.Info("Key sequence '34'.");   
  5.  Keyboard.Press("34");   
  6.   }   
  7.    
  8.  public static void SetSecondnum()   
  9.  {   
  10.   //Your code here. Code inside this method will not be changed by the code generator.   
  11.  Report.Info("Key sequence '56'.");   
  12.   Keyboard.Press("56");   
  13.   } 

修改如上代码吧 对应key值替换成自动生成属性:

 
  
  1. public static void SetFirstnum()   
  2.  {   
  3.  //Your code here. Code inside this method will not be changed by the code generator.   
  4.  Keyboard.Press(Firstnum);   
  5.  }    
  6.  public static void SetSecondnum()   
  7.   {   
  8.  //Your code here. Code inside this method will not be changed by the code generator.   
  9.  Keyboard.Press(Secondnum);   
  10.   } 

ok.到这那么录像关于加法运算中运算的参数1和参数1 都可以通过属性封装在C#编码中进行控制 测试中涉及到多次循环测试 以不同数据录入测试Bug 回头看看Program.cs文件Main方法:

 
  
  1. ...  
  2. try  
  3. {  
  4. //动态设置两个输入计算的参数  
  5. Record1.FirstName = row["FirstNum"].ToString();  
  6. Record1.LastName = row["LastNum"].ToString();  
  7. //循环调用Start方法  
  8. Record1.Start();  
  9. }  
  10. catch (RanorexException e)  
  11. ...  

如上当我们做好循环调用可执行测试程序.剩下就是需要根据测试案例制作测试数据录入进行测试. ok。这里利用SqlServer2005数据库来制作一个数据测试表 存储测试数据 建立测试表:

 
  
  1. USE master   
  2. go   
  3.  
  4. CREATE TABLE TestCodeDate   
  5. (   
  6. id INT NOT NULL PRIMARY KEY IDENTITY(1,1),   
  7. Firstnum VARCHAR(50) NOT NULL,--参数1   
  8. Secondnum VARCHAR(50) NOT NULL,--参数2   
  9. Resultnum VARCHAR(50) NOT NULL,--计算结果   
  10. TestDate DATETIME NOT NULL DEFAULT(GETDATE())--测试时间   
  11. )   
  12. go 

下一步就是在测试程序获得与本地Sql2005数据库数据并循环自动化测试. 剩下工作就很简单了 只需在Program.cs文件中获取数据 并循环录入    循环调用自动化测试程序自动执行 :

 
  
  1. ...............................   
  2. try   
  3. {   
  4. //TODO: Code here - for example:   
  5. //获取数据方式 循环执行测试 [获取数据方法]   
  6. System.Collections.Generic.List<DataDriverEntity.DataDriverModel> getdatalist=Program.GetTestDataList();   
  7. if(getdatalist.Count>0)   
  8. {   
  9. foreach(DataDriverEntity.DataDriverModel getmodel in getdatalist)   
  10. {   
  11. //设置DAtaDriver 属性    
  12. Recording1.Firstnum=getmodel.Firstnum.ToString();   
  13. Recording1.Secondnum=getmodel.Secondnum.ToString();   
  14. //重复调用 [测试]   
  15. Recording1.Start();   
  16. }   
  17. }   
  18. }   
  19. catch (ImageNotFoundException e)    
  20. ................. 

源码中DataDriverEntity.DataDriverModel是我新建一个实体类用来封装测试数据 定义如下:

 
  
  1. /// <summary  
  2. /// 数据测试实体  
  3. /// </summary>  
  4. public class DataDriverModel  
  5. {  
  6. public int Id { get; set; }  
  7. public int Firstnum { get; set; }  
  8. public int Secondnum { get; set; }  
  9. public int Sumnum { get; set; }  
  10. public DateTime CreateDate { get; set; }  

由此一个简单对Silverlight页面实现DataDriver Test的程序基本完成了.

<3.2>编译执行

当做了整个测试流程. 可以操作菜单中进行编译: Build Soluction 查看输出:

编译成功后. 我们可以直接在Ranorex工具点击运行:

编译成后也可以Ranorex为了保证整个流程重复执行. Ranorex工具把整个流程封装EXE可执行文件. 很方便我们调用执行. 很方便吧.

就此利用Ranorex工具完成实现 Silverlight Application Data Driver Test.

因为Ranorex工具退出相对较晚 所以目前基本上没有相关的中文资料和文档可以参考. 这对一些.Net程序员更熟悉的是Visual Studio编码工具操作. Ranorex也考虑到这点特别这这个2.3.4版本中对Visual Sutdio加以集成.虽然只是简单集成 但这对我们更熟悉Visal Studio.而言可以说一个很大进步.

如果不喜欢Ranoex工具编译环境 你可以换成你熟悉的Visual Studio中照样可以做 Silverlight Test Driver工作.

首先在Silverlight Solution中建立一个独立Test Applcation 项目类型是一个输出Comsole Application:

项目建立成功后在新建的Comsole Application中添加对Ranorex工具DLL引用:

 从引用窗体中能看到Ranoex.Core.DLL:

进入Main方法 添加对Ranoex.Core.DLL的引用:

 
  
  1. //添加引用   
  2. using System.Drawing;   
  3. using Ranorex; 

修改Main方法用来返回执行状态:

 
  
  1. [STAThread]    
  2. static int Main(string[] args)  

Main方法中调用系统附件的中计算器来进行计算. 下面是从Ranorex 复制过来的脚本代码:L

 
  
  1. int error = 0;   
  2.  
  3.  try    
  4. {    
  5. //调用附件计算器   
  6. System.Diagnostics.Process.Start("calc.exe");    
  7. Form form = Host.Local.FindChild<Ranorex.Form>("Calculator");    
  8. form.Activate();    
  9. Button button = form.FindChild<Ranorex.Button>("2");    
  10. button.Click();    
  11.  
  12. button = form.FindChild<Ranorex.Button>("*");    
  13. button.Click();    
  14. button = form.FindChild<Ranorex.Button>("3");    
  15. button.Click();    
  16.  
  17. button = form.FindChild<Ranorex.Button>("=");    
  18. button.Click();    
  19. }    
  20. catch (RanorexException e)    
  21. {    
  22. Console.WriteLine(e.ToString());    
  23. error = -1;    
  24. }    
  25.  
  26. return error; 

you see!就这末简单 只需通过Ranoex工具进行录制把录制后自动生成的测试脚本Copy到Visual Studio中. 即可方便调用运行.

参考资料:

Silverlight Unit Test Framework

Silverlight and Unit Test

UI Automation in Silverlight - Part II (The Easy Way)

Testing Silverlight Applications

Silverlight Unit Test Review

Plug-in to Silverlight UI Automation

Ranorex Use Guide Support Center

源码和测试视频见附件。