微软Visual Studio 2010中UI自动测试技术探讨

1  引言

    Visual Studio是微软公司著名的开发工具,在最新的2010版中对测试部分做了很大的加强,加入了很多新的测试方法,本文将着重介绍一下其新加入的UI自动测试(CodedUI test)功能。
    传统的测试过程主要由功能测试和程序结构测试组成,也就是常说的黑盒测试和白盒测试,他们一般所占的比重大致为80%和20%,而黑盒测试主要由手工来做。由此可见,提高黑盒测试自动化,可以极大的提高测试效率。
    UI的自动测试不是一个新概念,目前已经有很多相关的产品上市,强大的如QTP(Quick Test Professional)等,较差的如“按键精灵”之类的工具。但是QTP等工具的价格不是一般中小型软件公司所能承受的,而“按键精灵”类的工具主要 不是面向UI自动测试研发的,功能上较差。
    Visual Studio 2010中UI自动测试功能的推出,给我们提供了一个新的思路,主要优势在于:
    (1)跟Visual Studio无缝集成,可以直接在Visual Studio中调用,同时可以在Visual Studio 2010 Team Foundation的实验室中心集成,实现在虚拟机中自动部署并执行测试。
    (2)和微软Windows平台的兼容性好。因为二者都是微软自家的产品,自然提供了非常良好的兼容性。
    (3)使用方便,入门容易。同时支持脚本的自动录制和手工编写。脚本支持C#、VB、VC++等多种语言,测试人员可以自行选择自己熟悉的语言。当然如果测试人员不懂编程也没问题,自动录制脚本时可以不写一行代码。
    (4)价格适中,适合中小企业使用。这里需要指出的是:只有Premium和Ultimate版才包含UI自动测试功能,Professional版是不 带此功能的。根据微软在线商店的信息Premium版(含MSDN)每个授权售价2千多美元,Ultimate版(含MSDN)每个授权售价3千多美元, 比起QTP之类工具动辄几十万上百万美元的售价,微软的价格还是非常实惠的。

2  VS2010中UI自动测试技术入门

    下面我们通过一个例子,逐步为读者讲解一下,如何在VS2010中建立一个UI自动测试的工程。UI自动测试可以支持Web浏览器、Window From、WPF的程序,不过不支持Silverlight程序。为了简单起见,我们选择了Windows自带的计算器工具作为测试对象,主要测试一下计 算器的加法功能。这里需要稍微提一下,VS2010的UI自动测试并不需要被测试程序提供源代码。
    步骤一:创建一个测试工程
    打开VS2010,通过菜单的[文件]→[新建]→[项目]新建一个测试项目,命名为TestProject(也可以随意命名),这里为了方便讲解,我们选择了一个C#的测试项目模板。(VB、VC++语言也是支持的)
    工程建立好以后,我们在[解决方案资源管理器]中的TestProject节点上(注意不是解决方案节点)点击右键,选择[添加]→[编码的UI测试],来建立一个新的UI测试项。
    之后弹出了一个对话框,标题为“为编码的UI测试生成代码”,这里有2个选项,一个选项是“录制操作、编辑UI映射或添加断言”,另一个选项是“使用现有的操作录制”,因为我们是新建测试项,所以选择第一项。
    此时,在屏幕的右下角弹出了脚本录制的工具框,如图1所示。
图1  脚本录制工具框
    步骤二:录制测试脚本
    (1)点击脚本录制的工具框的第一个按钮(红色的),开始录制。此后,我们在操作系统范围内的核心操作都将被记录。
    (2)从[开始]菜单中启动Windows的计算器工具。
    (3)点击计算器上的数字键[1]。
    (4)点击计算器上的加法键。
    (5)点击计算器上的数字键[2]。
    (6)点击计算器上的等号键。
    (7)点击脚本录制的工具框的第一个按钮,停止录制。
    (8)通过脚本录制工具框的第二个按钮,可以查看我们操作的记录,对于没有意义的操作记录,可以在这里删除。确认无误后继续操作。
    (9)点击脚本录制的工具框的第四个按钮,生成代码,函数命名为RecordedMethod1(也可任意命名)。
    步骤三:增加断言
    (1)增加断言的目的其实就是做出一个对我们操作结果的判定。将脚本录制工具框的第三个按钮拖拽到计算器的结果框上,这时会有一个蓝色的方框将结果框括起来。
    (2)之后会弹出对话框提示UI的控件属性,选择[Text]属性后点击鼠标右键,选择添加断言。[比较运算符]选择AreEqual,[比较值]设置为[3. ]。
    (3)点击脚本录制的工具框的第四个按钮,生成的函数命名为AssertMethod1(也可任意命名)。
    (4)点击脚本录制的工具框的关闭按钮,回到VS2010的主画面中。
    步骤四:启动测试
    在VS2010的主画面中按[F5]键启动程序调试,VS2010的测试工程也可以当作是普通的程序工程一样调试运行的,可以看到刚才我们录制的操作流程被回放了一遍,最后在屏幕下方的[测试结果]选项卡中,显示测试已经通过了。
    细心的读者可以试验一下,操作流程回放的过程,并不是照搬录制的过程,比如鼠标的移动轨迹就不是按照录制时的轨迹。这说明录制过程只记录了核心的有效操作数据,回放时可以节省测试的运行时间。
    步骤五:修改测试项
    上面我们看到了一个已通过的测试,那么未通过的测试是什么状况呐。让我们做一点修改。比如这里我们期望,刚才的“1+2”的操作,最后得出的结果为“4”,而不是返回的“3”。这样按照刚才的测试,就是未通过的。
    在[解决方案资源管理器]中的UIMap.uitest节点上点击右键,选择[使用编码的UI测试生成器进行编辑],来进行修改。
    将脚本录制工具框的第三个按钮拖拽到计算器的结果框上,之后会弹出对话框提示UI的控件属性,选择[Text]的右键菜单,选择添加断言。[比较运算符] 选择AreEqual,[比较值]设置为[4. ]。点击脚本录制的工具框的第四个按钮,生成代码命名为AssertMethod1,单击[替换并生成]按钮,覆盖了原来的测试方法。
    这样我们就修改了刚才的断言。
    关闭脚本录制工具框,回到VS2010的主画面中。按[F5]运行测试。这次测试没有通过,运行后停到了出错的测试项上,并提示了错误的内容。

3  原理分析

    VS2010中UI自动测试的扩展框架如图2所示。
    其中,处于底层的是网络插件模块和富客户端插件模块,是技术抽象层指令的具体执行者。他们主要通过Windows API、钩子函数等技术手段,融合进需要测试的程序中,然后模拟出用户的操作。
    技术抽象层模块,主要用于从不同的技术和计算机语言中,例如Web浏览器、MFC、Window From、WPF等,抽象出相通的操作概念,然后再交付底层执行。
    录制记录模块,录制了操作的过程,并通过过滤/聚合的规则提取并化简核心操作。我们可以注意到,在录制脚本的过程中,不是每个操作的细节都被完整的记录下来的,比如鼠标的轨迹就没有被记录,因为我们关注的只是鼠标点击的动作。
    播放模块,可以回放测试脚本。
    位于顶层的是测试运行模块和CodedUI Test模块,提供脚本录制和测试的用户交互界面,生成并解释用户可以理解的用高级语言编写的测试脚本。

4  提高

    前面讲述了如何通过工具录制一个测试脚本,但是录制的脚本想修改的话,是非常麻烦的,需要重新录制一遍,而且自动生成的代码非常多,想要修改时很难找到地 方。其实,测试脚本是支持手工编写的,并且手工编写的脚本要比录制的简洁许多,而且更容易维护。下面我们介绍一下手工编写测试脚本的步骤,还是以计算器为 例。

 

图2  界面架构示意图

 

    步骤一:创建一个测试工程
    同录制脚本的过程一样,新建一个测试工程并添加[编码的UI测试],不过在选择“为编码的UI测试生成代码”时,应该选择[取消]。
    步骤二:编写脚本(在CodedUITest1.cs文件中编辑)
    (1)因为使用了类库,所以首先要声明该类库的引用
using Microsoft.VisualStudio.TestTools.UITesting.Win Controls;
    (2)在用脚本打开计算器工具(可以直接在CodedUITestMethod1方法中编写)
    ApplicationUnderTest app = ApplicationUnderTest.Launch(Environment.GetFolderPath(Environment.SpecialFolder. Windows)+ @"\system32\calc.exe");
    (3)找到控件上的文字为“1”的按钮,并模拟点击事件。这里注意,我们找的是控件上的文字,而不是控件的位置,控件上的文字一般是不会经常修改的,而且文字相同的情况也不是很多。
    WinButton button1 = new WinButton(app);
    button1.SearchProperties[WinButton.PropertyNames.Name] = "1";
    Mouse.Click(button1);
    (4)找到上面文字为“+”的按钮,并模拟点击事件
    WinButton button2 = new WinButton(app);
    button2.SearchProperties[WinButton.PropertyNames.Name] = "+";
    Mouse.Click(button2);
    (5)找到上面文字为“2”的按钮,并模拟点击事件
    WinButton button3 = new WinButton(app);
    button3.SearchProperties[WinButton.PropertyNames.Name] = "2";
    Mouse.Click(button3);
    (6)找到上面文字为“=”的按钮,并模拟点击事件
    WinButton button4 = new WinButton(app);
    button4.SearchProperties[WinButton.PropertyNames.Name] = "=";
    Mouse.Click(button4);
    (7)因为计算器中,显示结果的控件为Id等于403的窗口控件,并内嵌了一个Edit控件。所以编写如下代码来获得该Edit控件的Text属性,并判断是否与期望值相等。
    WinWindow window = new WinWindow(app);
    window.SearchProperties[WinWindow.PropertyNames.ControlId] = "403";
    WinEdit result = new WinEdit(window);
    Assert.AreEqual("3. ",result.Text);
    (8)最后关闭计算器
app.Close();
    步骤三:启动测试
    同前面介绍的录制脚本一样,按[F5]键启动测试。我们看到计算器被打开,并且有模拟的鼠标操作,最后测试通过。

5  结束语

    上面介绍了Visual Studio 2010中的UI自动测试功能。在实际应用过程中,自动测试技术不仅仅可以改善传统的黑盒测试方法,还可以为许多最新的软件开发理论如测试驱动开发、敏捷开发等等的提供非常有效的支持。
    测试驱动开发是一种新式的开发方法。它要求在编写程序功能代码之前先编写测试代码,之后通过测试来推动整个开发的进行。目的是使代码简洁可用并且提高质量,并加速整个开发过程。
    敏捷开发提倡的是不断的迭代开发与分期交付并欢迎需求的变更。
    从上面的概念就可以看出,没有一个强大而高效的测试支持,这些新理论是无法很好的实施的。

转载于:https://www.cnblogs.com/yishion-liu/archive/2012/03/01/2375986.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值