UI Automation在功能自动化测试中的应用

2018-01-03 19:55:12来源:CSDN作者:qq_37546891人点击

分享

引言

功能测试已跨越了单靠手工敲敲键盘、点点鼠标就可以完成的阶段,正朝着自动化和智能化的方向发展。市场上涌现了一大批功能测试自动化工具,提高了测试工程师的效率。但是当遇到工具本身的功能与测试工程师的需求发生偏离时,给使用工具带来了较大的挑战。

UI Automation作为一个应用程序接口,主要提供对UI控件的信息收集与控制访问,它提供的自动化库可以准确识别windows平台下的UI控件,提供了自定义方式进行自动化测试的方式,弥补了上述的不足。

本文主要针对微软提供的UI Automation自动化测试技术进行研究分析,首先介绍了并分析UI Automation的体系结构,在此基础上给出了UI Automation的自动化库进行自动化测试的基本流程,最后基于此基本流程结合windows自带的计算器程序给出测试的具体实施步骤。

1 、MS UI Automation

MS UI Automation:即让控件和应用程序具有更好的可达性(accessible)。

MS UIA,简单来讲,它就是几个dll,提供了一套API和Interface,及其相应的模式,让软件的开发者遵循该模式去实现相应的interface,从而软件的使用者(不仅仅是客户,还包括例如测试人员想编写一些自动化测试代码来完成程序相关的业务逻辑)能更好的使用该软件。

和原来的MSAA相比较:UIA重新设计了一套架构,无论是对传统的winform,还是新的wpf,定义了一套统一的模型;其API的使用也相对更简单;同时,和.net framework 3.0一起,也有个UISpy的工具,能辅助大家来使用UIA。

2 、UI Automation体系结构

UI Automation,微软提供的UI自动化库。它包括在.NET Framework 3.0中,是Windows Presentation Foundation(WPF)的一部分,可进行UI测试自动化。此自动化库一开始就是为可访问性和UI测试自动化任务而专门设计的,使用UI自动化库来测试运行支持.NET Framework3.0的操作系统,例如Windows XP、Windows Vista、Windows Server 2003和Windows Server 2008的主机上Win32应用程序、.NET Windows的窗体应用程序和WPF应用程序。

在UI Automation中,所有的窗体、控件都表现为一个AutomationElement、AutomationElement中包含此控件或窗体的属性,在实现自动化的过程中,通过其相关属性进行对控件自动化操作。

对于UI用户界面而言,所用显示的桌面上的UI,其实际上是一个UI Tree,根节点是Desktop。在UI Automation中,根节点表示为AutomationElement RootElement。通过根节点,可以通过窗体或控件的Process Id、Process Names或者Windows Name找到相应的子AutomationElement,例如Dialog(对话)、Button、TextBox、CheckBox等标准控件,通过控件所对应的Pattern进行相关的操作。

UI Automation的体系结构如图:
  这里写图片描述

1、在服务器端由 UIAutomationProvider.dll 和 UIAutomationTypes.dll 提供;
2、在客户端由 UIAutomationClient.dll 和 UIAutomationTypes.dll 提供;
3、UIAutomationCore.dll 为 UI 自动化的核心部分,负责服务器端和客户端的交互
4、UIAutomationClientSideProviders.dll 为客户端程序提供自动化支持;

在 UI 自动化库体系结构中使用客户端-服务器视点和命名约定。从 UI 测试自动化的角度来看,意味着所测试的应用程序被称为服务器测试工具被视为客户端,测试工具客户端向所测试的应用程序(服务器)请求 UI 信息。

UIAutomationClient.dll 库实际上就是 UI 自动化客户端使用的自动化库。另外,UIAutomationTypes.dll 库包含 UIAutomationClient.dll 和其他 UI 自动化服务器库使用的各种类型的定义。
除 UIAutomationClient.dll 和 UIAutomationTypes.dll 库外,还将看到
UIAutomationClientProvider.dll 和 UIAutomationProvider.dll 库。
UIAutomationClientSideProvider.dll 库包含一组与构建时不支持自动化的控件配合使用的代码,这些控件可能包括旧式控件和自定义的.NET 控件。通常一般的应用程序使用标准控件(均设计为支持 UI 自动化),因此不需要此库。
UIAutomationProvider.dll 库是一组接口定义,可供创建自定义 UI 控件和希望控件能被 UI 自动化库访问的开发人员使用。

3 、UI Automation 的自动化测试流程

下面,主要描述基于 UI Automation 自动化库进行 UI 自动化测试的基本流程:
(1) 测试代码首先应该启动所测试的应用程序;

Process p = Process.Start(“..//app.exe”);

(2) 获取对主机的桌面窗口的引用作为 AutomationElement:

utomationElement aeDesktop = AutomationElement.RootElement;

(3) 获取应用程序:

aeDesktop.findFirst(TreeScope.Children, new PropertyCondition(AutomationElement.NameProperty,"标题名(属性信息)");

(4) 获取控件的引用 :

AutomationElement aeButton = aeForm.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.NameProperty","按键的名称"));

(5) 触发控件事件 :

InvokePattern ipClickButton = (InvokePattern)aeButton.GetCurrentPattern(InvokePattern.Pattern);ipClickButton.Invoke();

(6) 设置测试结果的验证结构 :

If (result == "期望结果"){ Console.WriteLine("/nTest:Pass");} Else

(7) 关闭所测试的应用程序 :

WindowPattern wpCloseForm = (WindowPattern)aeForm.GetCurrentPattern(WindowPattern.Pattern)

注意:
InvokePattern是一种 AutomationPattern 类型,用于控件的触发,了解 AutomationPattern 类是了解如何使用 UI 执行测试的关键。

常用的模式有 : ExpandCollapsePattern、GridPattern、GridItemPattern、InvokePattern、MultipleViewPattern、RangeValuePattern、ScrollPattern、SelectionPattern、SelectionItemPattern、TablePattern、TableItemPattern、TextP-attern、TogglePattern、TransformPattern、ValuePattern、WindowPattern。

4 、实例分析

我们结合 windows 自带的计算器小程序讲述如何基于 UI Automation 技术来实施功能自动化测试。
图为 windows 自带的计算器小程序:
这里写图片描述
测试需求描述:测试图中红色标记的功能,加法功能测试,即 7+8=15

Process p = Process.Start("calc.exe");AutomationElement aeDesktop = AutomationElement.RootElement;   //触发“7”键,“8”、“+”和“=”键类似代码AutomationElement Button_7 = aeForm.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.NameProperty, "7"));InvokePattern ipClickButton7 = (InvokePattern)Button_7.GetCurrentPattern(InvokePattern.Pattern); ipClickButton7.Invoke();aeForm.FindAll(TreeScope.Children, new PropertyCondition(AutomationElement.ControlTypeProperty,ControlType.Edit)); string Result= TextBox.GetCurrentPropertyValue(ValuePattern.ValueProperty);

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台