UML软件工程组织

 

 

使用Windows Mobile Test Framework进行Windows Mobile程序的自动化测试
 
作者: 未知 来源: 网络转载
 

前言:

 随手打开MEDC 2007的课程列表页面,看到了一个课程的标题《使用Windows Mobile Test Framework进行自动化测试》,突然想起来新的Windows Mobile 6 SDK中似乎包含这个叫做什么Windows Mobile Test Framework的东东,于是乎打开WM6的安装目录下的Tools\Windows Mobile Test Framework\Windows Mobile Test Framework.zip这个zip包瞅一瞅。

真是不看不知道,一看吓一跳。。。。。。微软居然把这个框架单独发布出来了。其实这套东西貌似在Windows CE 5的CE Tool Kit中就包含,不过现在貌似把它单独提出来进行推广了。那么,我也来写一个关于它的系列和大家来研究研究这套Windows Mobile Test Framework吧。

一、微软Windows Mobile Test Framework简介
  
 Windows Mobile Test Framework(以后简称为WMTF)是微软内部使用的一套Windows CE/Windows Mobile上的自动化测试框架。使用这套框架,我们可以很方便的用它来模拟用户来对您的程序进行操作,来进行功能/UI/本地化等多种测试。

 此框架的整体结构如下图所示:


 绿色部分为微软在这个Windows Mobile Test Framework中所提供的。
 橙色的UIAL,为我们需要使用微软在Windows Mobile Test Framework中的工具来自己生产且做少量修改工作的。
 蓝色部分为需要我们大家自己来完成的部分。

二、Windows Mobile Test Framework各层次介绍

 1) Utils.Net:
 这一层提供了很多在其他各个层次中经常需要用到的公共对象或者是一些在.NET Fx中有而在.NET CF中被省略了的对象,例如进程/设备信息/内存/注册表等等等等。。。。。。

 2) Logging:
 这一层顾名思义,当然是封装了日志记录的功能,用来记录测试中的过程和结果。当然,这套Logging机制非常不错,不但在这里可以用,您甚至可以把它用于开发过程中甚至是桌面程序开发中。

 3) DATK:
 DATK的全称是Device Automation ToolKit。它是一套影射了所有的Windows CE上的标准控件的一套类库。例如文本框,列表框,按钮等等。同时,在这一层还有一个主要的对象叫做WindowsFinder,它几乎可以说是DATK甚至是WMTF的核心部分。您可以通过它来制定条件(例如类型,文本,进程等等)来寻找到某一个控件,然后把这个控件绑定到一个DATK控件上,然后您的代码来操作这个DATK 控件就可以实现对实际的控件的调用。这其实就是Windows Mobile Test Framework的核心部分。

 4)Mobility ToolKit:
 以后我们将它简称为MTK。MTK里面主要在DATK的基础上增添了许多针对移动设备特有的对象。可以认为它是DATK的一个扩展。

 5)UIAL:
 UIAL(UI Abstraction Layer),它是您要测试的应用程序的界面的一个影射。您必须为您的需要测试的每一个界面建立对应的UIAL层代码(借助微软提供的工具),这样才可以对程序进行测试。一个典型的UIAL层代码通常包含4部分。

A. 对话框类:它是你要测试的那个对话框的一个影射,同时这个类里面也应该包含该界面上面所有控件地应的DATK控件。
B. 应用程序类:用来启动该对话框。
C. IdnHolder类:用来查找对话框中的本地化资源文字。
D. 自测试代码:赫赫。。。从这一层起,就需要做测试了。

6) Area Libraries:
 在这一层我们通常来封装一些可以复用的步骤。举例来说,您的测试程序中需要打开某一个对话框,而这个步骤显然是可以复用的(也许为了测试不同的地方我们需要反复的打开这个对话框)。那么我们就可以把这个打开程序,然后再打开该对话框的步骤封装到Area Libraries便于以后复用。

 7)Test Cases & Test Suites:
 这一层我们通常简称为Tests层,显然,在这一层我们用来编写我们的测试代码。和NUnit之类的很相似。使用Suite来把一些Test Cases组织到一起。

最终,测试引擎Tux.NET将调用Tests层中的测试代码,按照您的测试脚本来测试程序。

好了,这里您大概也许对Windows Mobile Test Framework有了个初步的印象了吧?也许还很晕,赫赫。。。没关系,在后面的章节中我将会陆续带领大家走进去探个究竟。 :)

在上一个小节中给大家简单介绍了WM6 SDK中带的Windows Mobile Test Framework。各位朋友可能对Windows Mobile Test Framework有了一个大概的印象,但是对于怎么使用它还是有些疑惑。由于我的工作比较繁忙,一直没有时间更新这个系列,对此很是抱歉。今天,我们就来用这个Windows Mobile Test Framework来做一个小小的测试,看看它是怎么运行的。让大家对它有个感性的认识。

一、准备工作

1. 打开Visual Studio 2005的菜单中的 工具-〉设备仿真器管理器。然后打开一个Windows Mobile 6的Professional模拟器。然后将该模拟器通过ActiveSync(如果是Vista则用WMDC)与计算机进行连接。

2. 将Windows Mobile Test Framework.zip解开到某一个目录中。双击运行其中的CommandWindows快捷方式。则会弹出来一个命令提示符窗口。您在该窗口中输入“Set”然后回车,会发现“Path”参数中增加了Windows Mobile Test Framework下得Bin目录的路径。以及增加了_WMTFROOT这个变量。

3. 在该命令提示符窗口中输入“SetupDevice”然后回车。则会自动向设备上Copy和安装一些必要的文件。(SetupDevice是一个批处理文件,您也可以在Bin目录下找到)

4.在设备模拟器上,你会发现在“程序”中安装了一个快捷方式“CalView”。在设备的根目录下有一个test目录,里面是刚才copy进来的那些文件。其中包含CalView。您可以打开CalView,它是一个用来查看pOutlook中的日历信息的小程序。

5. 通过ActiveSync或者WMDC将“%ProgramFiles%\Windows Mobile 6 SDK\Tools\Security\SDK Development Certificates\Certs.cab”拷贝到模拟器中,然后安装它。

6. 手动在模拟器中的日历中建立一个条目以备后面的步骤使用。

二、了解测试工程

1. 打开_WMTFROOT下的CalViewSample这个目录,您会发现其中有三个子目录,分别是“AbstractionLayer”,“AreaLibrary”和“Tests”。它们就是在上一小节中介绍过的“UIAL”、“AreaLibrary”和“Tests”层。至于DATK和MTK,呵呵,他们都是微软已经提供了的。您可以在_WMTFROOT下的DeviceFiles目录中找到(分别是Microsoft.WindowsCE.DATK.dll和Microsoft.MobileDevices.MobilityToolKit.dll)。

2. 由于Tests层的代码要引用Area Library层的代码;而Area Library层的代码要引用UIAL层的代码。所以,我们先用VS2005打开AbstractionLayer下的项目。CalView的AbstractionLayer分别针对PPC和Smartphone做了两个版本。我们先打开PocketPC目录下的解决方案。你会发现该解决方案中有两个项目,一个是“Microsoft.MobileDevices.AbstractionLayer.CalView.PocketPC”,一个是“TuxNet”。其中前者就是CalView的PPC版的程序的UIAL层代码,后者其实是一个空的项目,它的目的只是为了将它里面包含的那些文件部署到设备上去。打开UIAL层项目的属性,“设备”选项页。复选中“Authenticode签名”中的“用此证书对项目输出进行签名”。然后点击“选择证书...”,选中“TEST USE ONLY - Sample Privileged Root for Windows Mobile SDK”,这是一个测试用的特权证书。如果这里没有显示这个证书,那么点击“管理证书”,然后导入“%ProgramFiles%\Windows Mobile 6 SDK\Tools\Security\SDK Development Certificates\SamplePrivDeveloper.pfx”。然后再次打开这个选择证书页面就可以看到。它的目的就是给您的UIAL层代码进行测试签名,这样便于访问一些特权函数,避免运行过程中不断的弹出那些提示框,然后再编译此解决方案。接着关闭该解决方案,同样处理以及编译Smartphone版的UIAL层解决方案和Area Library层的解决方案。

3. 打开Tests的解决方案同样处理。然后设置Tests层项目的属性中“调试”选项页中,“启动操作”为“启动外部程序”,并设置其值为“\test\TuxNet.exe”。

三、运行测试程序

1. 按下F5运行解决方案,注意请选择您已经启动好的那个模拟器。

2. 您会发现模拟器中系统自动打开运行了CalView这个程序。然后调用了其中的“copy”菜单项来复制了一个日历项目。最后退出程序。

3. 从模拟器中打开\test目录,您会发现一个results.log文件,将它从模拟器中copy到PC端,用记事本打开,它就是刚才的运行记录,内容比较长,我摘录其中几个部分如下:

<TESTCASE ID="0">
*** Test Name: Microsoft.MobileDevices.Tests.CalView.CalViewTests.CalViewBVT
*** Test ID: 0
BVT: BVT
Repro: -assembly Microsoft.MobileDevices.Tests.CalView.dll -suites CalViewTests -tests CalViewBVT
Begin Step: CalViewBVT
[1] LaunchApplication(CalView, finder): Attempting to launch from start menu
[1] LaunchFromStartMenu(CalView, WindowFinder, False): Opening start menu
[1] OpenStartMenu(): Clicking on start menu to open it
[1] ClickStartMenu(): Clicking on start menu at (2, 2)
[1] ClickStartMenu(): Start menu successfully opened
[1] LaunchFromStartMenu(CalView, WindowFinder, False): Getting list of start menu items
[1] LaunchFromStartMenu(CalView, WindowFinder, False): Item found - clicking on index 9
[1] countBefore = 1
[1] countAfter = 2
[1] Verification = Pass: Count after is one greater
[1] ClickOK(): Clicking on task bar at (230, 10)
End Step : CalViewBVT
Verification = Pass: CalViewBVT
*** Result: Passed
</TESTCASE>

*** SUITE SUMMARY
***
*** Results
*** Passed: 1
*** Skipped: 0
*** Failed: 0
*** Aborted: 0
*** -------- ---------
*** Total: 1
</TESTGROUP>

4. 上面Log中的我标记出来的第一部分即是我们刚才跑的一条test case的运行记录;标记的后一段是该运行的整体情况,这次运行总共1条case,结果为pass。

5. 我们看到这条case的名称为Microsoft.MobileDevices.Tests.CalView.CalViewTests.CalViewBVT ,那么我们在tests工程的CalViewTests.cs中可以找到如下代码,它就是这条case:

/// <summary>
/// Add a description of the steps this test executes.
/// eg:
/// 1) Open Contact app
/// 2) Create a Contact
/// 3) Verify contact appeats in Main list view
/// 4) Close Contacts app
/// </summary>
/// <returns>Log.LogResult.Pass on success</returns>
[TestCaseAttribute("BVT", Type = TestType.BVT)]
public Log.LogResult CalViewBVT()
{
// Open the application
CalViewAreaLib.General.LaunchApp();

// Store and log the beginning count
int countBefore = CalViewAreaLib.MainDialog.GetItemCount();
Utils.GlobalLogger.AddComment("countBefore = {0}", countBefore.ToString());

// Select and copy one of the items
CalViewAreaLib.MainDialog.SelectItem(0);
CalViewAreaLib.MainDialog.CopySelectedItem();

// Store and log the count after copy
int countAfter = CalViewAreaLib.MainDialog.GetItemCount();
Utils.GlobalLogger.AddComment("countAfter = {0}", countAfter.ToString());

// Log a result based on the conditional that countAfter is one greater than countBefore
Utils.GlobalLogResultManager.Results.Add("Count after is one greater", (countAfter == (countBefore + 1)));

// Close the app to clean up
CalViewAreaLib.General.CloseApp();

// Results manager kept track of the result for you, return its summary
return Utils.GlobalLogResultManager.Results.Summary;

}

从case的步骤我们可以看到/猜测,它先后打开CalView程序,然后选择其中第一个条目,然后复制一个。然后察看是否条目数量增加了一个。最后关闭程序再输出结果。在这里这些代码的含义您可以通过UAIL或者AreaLibrary的代码来查看具体含义,在后面我的Blog中也会陆续进一步介绍。

四、小结

从上面的演示我们看到我们可以很方便的通过我们的代码来模拟用户来操作我们的程序并进行验证。不错吧?

好了,就先介绍到这里吧。

 

组织简介 | 联系我们 |   Copyright 2002 ®  UML软件工程组织 京ICP备10020922号

京公海网安备110108001071号