VS2010测试功能之旅:编码的UI测试(2)-操作“.NET研究”动作的录制原理(下)

  回顾

  在本章上部分介绍了操作动作的录制原理,描述了操作动作是如何录制,UIMap.uitest和UIMap.Designer.cs的代码如何生成,以及他们的结构。在这个部分,将着重说明如何通过修改UIMap1.uitest文件的操作动作部分的代码来控制UIMap1.Designer.cs操作动作部分代码的生成,实现第一种方式的自定义编码。

  内容简介 

  在上个部分,已经说明了UIMap.uitest文件的结构如下:

  其中InitializeActions,ExecuteActions,CleanupActions,OnErrorAction都是对于操作动作的描述:

  InitializeActions:指初始化需要执行的操作动作

  ExecuteActions:指测试过程中的操作动作(通过录制所生成的操作都默认放在ExecuteActions)

  CleanupActions:指测试完毕需要清理资源的操作动作

  OnErrorAction:指代异常处理的操作动作

  他们都对UIMap1.Designer.cs操作动作部分代码的生成和参数的生成有直接的影响。

  严格的说,放在InitializeActions下的操作动作和放在ExecuteActions,CleanupActions,OnErrorAction的动作没有任何本质上的区别,仅仅只是从一个代码可读性上的考虑。

  编码的UI测试所支持的Actions

  如果我们仔细观察过ExecuteActions录制所生成的代码,可以发现有一个共同特点,ExecuteActions的子节点都是以<Action>结尾形式的标签,那么编码的UI测试一共支持多少种的Action呢?这里我整理了一个列表,简单的介绍了测试所支持的Action和功能简介。


类 


说明 


AggregatedAction


为可以完成几种任务中任何一种的所有操作提供基类。


AssertAction


表示要包含在测试中其他两个操作之间的断言。


BrowserAction


表示可以完成几种浏览器任务中的任何一种的测试操作。


DelayAction


指定执行用户界面 (UI) 测试中的后续操作后的时间延迟。


DragAction


表示鼠标拖动操作。


DragDropAction


表示鼠标拖放操作。


ErrorAction


表示一个操作,测试记录器使用该操作报告它无法记录某一操作。


InputAction


表示所有基于文本的操作的基类。


KeyboardAction


表示单个的键盘用户操作。


LaunchApplicationAction


表示启动一个应用程序的 UI 测试操作。


MarkerAction


提供一种在操作序列中插入标记而不会在播放过程中导致任何操作的方法。


MouseAction


表示关于鼠标操作的信息。


NavigateToUrlAction


表示移动到某一 URL 的操上海企业网站设计与制作作。


NoOperationAction


表示不执行任何操作的用户界面 (UI) 测试操作。


RemoveKeysAction


提供有关聚合测试操作声明,从测试结果中移除此操作及之前的所有匹配键操作。


SendKeysAction


表示发送文本或键数组的测试操作。


SetBaseAction


为设置值或设置状态的测试操作提供基类。


SetStateAction


表示一个设置关联元素状态的测试操作。


SetValueAction


表示用于设置值的测试操作。


SharedStepsReferenceAction


为当前测试提供对一组共享步骤的引用。


StringAssertAction


表示一个字符串断言。


TestStepMarkerAction


表示测试操作序列中的一个标记,将记录该标记,但播放框架不使用该标记。


UITestAction


为用于用户界面 (UI) 测试的测试操作提供基类。


ValidationAction


表示一个验证属性值的操作。


VerifyConfigurationAction


表示一个验证配置的操作。


WarningAction


表示一个操作,UI 记录器使用该操作报告它无法正确录制某一操作。


WebDialogAction


表示一个报告 Web 对话框的操作。

  在这里将抽取几个主要的ACTION进行介绍。

  通过编写UIMap.uitest文件控制UIMap.designer.cs代码的生成。

  1.首先我们还是通过添加新项的方式建立一个新的Coded UI Test Map(编码的UI测试映射)。

  2.之后,直接进入UIMap1.uitest文件,可以发现代码如下:


<?xml version="1.0"?>
<UITest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Name="" Id="3efe829a-76df-439e-af0d-8d5c62727a1e" AssemblyVersion="10.0.21008.0" Version="1.0" xmlns="http://schemas.microsoft.com/VisualStudio/TeamTest/UITest/2010">
</UITest>

上海企业网站制作div>

  3. 关闭录制生成器(注:一定要先关闭才能修改,以后也是一样),编码初始化代码InitializeActions。

  我们还是先使用第一章提到的示例程序 下载点我

  假设现在如果要操作它,首先需要将其打开,在之前已经简单介绍过编码的UI测试支持的Action,可以把打开这个程序的操作作为InitializeActions(初始化操作)的一员,并为其生成一个方法,那么按照这个思路,在参照前面的Actions列表,可以发现需要两个Action:

  a、LaunchApplicationAction 打开应用程序。

  b、TestStepMarkerAction 为该步骤生成一个方法。

  现在我们开始编写代码,将其直接插入UITest节点内:


<InitializeActions>
<!— 打开示例文件,文件路径按实际情况填写-->
<LaunchApplicationAction>
<FileName>D:\RightDemo.exe</FileName>
</LaunchApplicationAction>

<!--为之前所有的操作步骤生成|一个方法,名称为LaunchApplication()-->
<TestStepMarkerAction MarkerInformation="LaunchApplication">
<ParameterName />
<StepId>-1</StepId>
<Direction>Start</Direction>
<Outcome/>
<Disabled>false</Disabled>
</TestStepMarkerAction>
</InitializeActions>

  编写之后,我们打开录制生成器,点击“生成代码”,可以发现在UIMap1.Designer.cs对应生成了几句代码,其中已经按照要求生成了LaunchApplication()方法和加载应用程序的语句ApplicationUnderTest.Launch(this.LaunchApplicationParams.ExePath, this.LaunchApplicationParams.AlternateExePath),语句如下:


/// <summary>
/// LaunchApplication - Use 'LaunchApplicationParams' to pass parameters into this method.
/// </summary>
public void LaunchApplication()
{
// Launch 'D:\RightDemo.exe'
ApplicationUnderTest rightDemoApplication = ApplicationUnderTest.Launch(this.LaunchApplicationParams.ExePath, this.LaunchApplicationParams.AlternateExePath);
}

  4. 编码执行代码ExecuteActions

  添加了初始化的InitializeActions,之后,我们需要给他添加ExecuteActions,用于执行界面上的操作,在编写操作之前,假设我们需要输入正确的用户名(Admin)和正确的密码(123456),然后点击登陆,检测是否弹出“登陆成功”的对话框。那么进行操作前,首先需要的是先捕获用户名文本框,密码文本框,登录按钮,弹出框文本这4个对象,之后再对这4个对象进行操作。

  添加对象的方法如下:

  首先,打开录制生成器,点上面的准星:

  之后,一直按住鼠标左键不放,将鼠标拖到用户名文本框,再松开:

  然后,我们可以看到对象库已经自动打开,其中UITbx_uidEdit就是被我们捕获的用户名文本框:

  这个时候我们点击 ,之后对象就被添加到对象库了,接下来按照同样的方法,依次将密码文本框,登录按钮,弹出框文本分别加入对象库,如图:

  之后点击“生成代码”,然后关闭录制生成器,可以看到在UIMap.uitest的<Maps>节点已经生成了相关的对象,而在UIMap.designer.cs的对象映射部分也添加了相应的代码(具体对象识别原理会在第三章提到,这里只先使用对象进行操作)。

  对象添加进入对象库了,现在只需要编写操作了。

  我们需要输入正确的用户名(Admin)和正确的密码(123456),然后点击登陆,检测是否弹出“登陆成功”的对话框,并生成两个方法,InputRightUidPwd()用于输入用户名和密码,AssertRightWindow()用于验证是否弹出相应的弹出框文本,那么需要依次用到如下Action:

  a.SetValueAction 设置用户名文本框的值

  b.SetValueAction设置密码文本框的值

  c.MouseAction 鼠标点击登陆按钮

  d.TestStepMarkerAction 生成方法InputRightUidPwd()

  e.AssertAction 为判断是否弹出生成断言

  f. TestStepMarkerAction 生成方法AssertRightWindow()

  按照这个思路,我们开始编写如下代码:

  (这里可以看到某些操作都带有UIObjectName属性,该属性表示被操作的对象是谁,也就是刚才捕获到对象库里面的对象名称)


<ExecuteActions>
<!--UIObjectName表示被操作的对象是谁-->
<SetValueAction UIObjectName="UIMap1.UI 系统登录Window.UITbx_uidWindow.UITbx_uidEdit">
<Value Encoded="false">Admin</Value>
</SetValueAction>
<SetValueAction UIObjectName="UIMap1.UI 系统登录Window.UITbx_pwdWindow.UITbx_pwdEdit">
<Value Encoded="false">123456</Value>
</SetValueAction>
<MouseAction UIObjectName="UIMap1.UI 系统登录Window.UI登录Window.UI登录Button">
<Location X="1" Y="1" />
<WheelDirection>0</WheelDirection>
<ActionType>Click</ActionType>
<MouseButton>Left</MouseButton>
</MouseAction>
<TestStepMarkerAction MarkerInformation="InputRightUidPwd">
<StepId>-1</StepId>
<Direction>Start</Direction>
<Outcome />
<Disabled>false</Disabled上海徐汇企业网站制作/span>>
</TestStepMarkerAction>
<AssertAction UIObjectName="UIMap.UI 提示Window.UI登陆成功Window.UI登陆成功Text">
<PropertyName>Exists</PropertyName>
<ExpectedValue>True</ExpectedValue>
<Type>Boolean</Type>
<PropertyCondition>AreEqual</PropertyCondition>
</AssertAction>
<TestStepMarkerAction MarkerInformation="AssertRightWindow">
<ParameterName />
<上海闵行企业网站设计与制作"color: #800000;">StepId>-1</StepId>
<Direction>Start</Direction>
<Outcome />
<Disabled>false</Disabled>
</TestStepMarkerAction>
</ExecuteActions>

  编写完毕之后,打开录制生成器,点击生成代码,之后关闭录制生成器,可以看到UIMap.designer.cs文件中也生成了对应的代码。


/// <summary>
/// InputRightUidPwd - Use 'InputRightUidPwdParams' to pass parameters into this method.
/// </summary>
public void InputRightUidPwd()
{
#region Variable Declarations
WinEdit uITbx_uidEdit = this.UI 系统登录Window.UITbx_uidWindow.UITbx_uidEdit;
WinEdit uITbx_pwdEdit = this.UI 系统登录Window.UITbx_pwdWindow.UITbx_pwdEdit;
WinButton uI 登录Button = this.UI系统登录Window.UI登录Window.UI登录Button;
#endregion

// Type 'Admin' in 'Tbx_uid' text box
uITbx_uidEdit.Text = this.InputRightUidPwdParams.UITbx_uidEditText;

// Type '123456' in 'Tbx_pwd' text box
uITbx_pwdEdit.Text = this.InputRightUidPwdParams.UITbx_pwdEditText;

// Click ' 登录' button
Mouse.Click(uI登录Button, new Point(41, 14));
}

/// <summary>
/// AssertRightWindow - Use 'AssertRightWindowExpectedValues' to pass parameters into this method.
/// </summary>
public void AssertRightWindow()
{
#region Variable Declarations
WinText uI 登陆成功Text = this.UI提示Window.UI登陆成功Window.UI登陆成功Text;
#endregion

// Verify that ' 登陆成功!' label's property 'Exists' equals 'True'
Assert.AreEqual(this.AssertRightWindowExpectedValues.UI 登陆成功TextExists, uI登陆成功Text.Exists);
}

  5. 编码清理代码CleanupActions

  清理代码仅仅执行两个操作,第一是点击弹出框,第二是关闭程序,然后则为其生成方法,执行操作前,首先需要捕获弹出框按钮对象,以及主窗体关闭按钮对象。

  然后用之前提到的方法将他们添加进对象库,然后生成代码,关闭录制生成器:

  按照思路编写3个action:

  a.MouseAction 鼠标点击确定按钮

  b. MouseAction 鼠标点击关闭按钮

  c.TestStepMarkerAction 生成方法ClearUpTest()

  代码如下:


<CleanupActions>
<MouseAction UIObjectName="UIMap1.UI 提示Window.UIOKWindow.UIOKButton">
<Location X="1" Y="1" />
<WheelDirection>0</WheelDirection>
<ActionType>Click</ActionType>
<MouseButton>Left</MouseButton>
</MouseAction>
<MouseAction UIObjectName="UIMap1.UI 系统登录Window.UI系统登录TitleBar.UICloseButton">
<ParameterName />
<Location X="1" Y="1" />
<WheelDirection>0</WheelDirection>
<ActionType>Click</ActionType>
<MouseButton>Left</MouseButton>
</MouseAction>
<TestStepMarkerAction MarkerInformation="ClearUpTest">
<ParameterName />
<StepId>-1</StepId>
<Direction>Start</Direction>
<Outcome />
<Disabled>false</Disabled>
</TestStepMarkerAction>
</CleanupActions>

  编写完代码之后,打开录制生成器,点击“生成代码”,可以看到UIMap1.Designer.cs文件也生成了相应的代码:


/// <summary>
/// ClearUpTest
/// </summary>
public void ClearUpTest()
{
#region Variable Declarations
WinButton uIOKButton = this.UI 提示Window.UIOKWindow.UIOKButton;
WinButton uICloseButton = this.UI 系统登录Window.UI系统登录TitleBar.UICloseButton;
#endregion

// Click 'OK' button
Mouse.Click(uIOKButton, 上海闵行企业网站制作an style="color: #0000ff;">new Point(1, 1));

// Click 'Close' button
Mouse.Click(uICloseButton, new Point(1, 1));
}

  6.现在,我们就可以开始执行我们刚才编写的测试了,建立一个CodedUITest.cs文件,然后编写如下代码即可(注意这3个方法的标签,分别是TestInitialize,TestMethod,TestCleanup),之后便可以进行测试了。


[CodedUITest]
public class CodedUITest1
{

UIMap1 UIMapTest{get;set;}

public CodedUITest1()
{
UIMapTest = new UIMap1();//这个UIMap1我们刚编写了操作
}

[TestInitialize]//注意这里是TestInitialize标签
public void CodedUITestMethod1()
{
UIMapTest.LaunchApplication();
}

[TestMethod]//这里是Method标签
public void CodedUITestMethod2()
{
UIMapTest.InputRightUidPwd();
UIMapTest.AssertRightWindow();
}

[TestCleanup]//这里是TestCleanup标签
public void CodedUITestMethod3()
{
UIMapTest.ClearUpTest();
}

public TestContext TestContext
{
get
{
return testContextInstance;
}
set
{
testContextInstance = value;
}
}
private TestContext testContextInstance;
}

  总结 

  本章主要介绍了操作动作的录制原理,操作动作代码的生成,以及如何通过修改UIMap.ui上海徐汇企业网站设计与制作test文件控制UIMap.designer.cs代码的生成,大家如果感兴趣,可以试试使用各个Action填充UIMap.uitest,看看究竟会在UIMap.designer.cs生成怎样的代码。

  因为UIMap.uitest一旦添加新对象或操作,点击自动生成后,都会对UIMap.designer.cs的代码进行一次覆盖,如果想要编写自定义C#代码,最好是将其写在UIMap.cs文件,例如,可以把在UIMap.designer.cs生成的方法粘贴到UIMap.cs,然后在UIMap.cs添加自己的验证逻辑,因为UIMap.cs不会被覆盖。

时间: 2024-10-01 11:39:08

VS2010测试功能之旅:编码的UI测试(2)-操作“.NET研究”动作的录制原理(下)的相关文章

VS2010测试功能之旅:编码的UI测试(1)

前言 研究VS2010的自动化测试有一段时间了,在研究的过程中,发现网上的VS2010相关的测试资料十分稀少,这给学习带来比较大的困难.幸运的是,自己因为常用QuickTest Professional做自动化测试,并且对.Net代码比较了解,使得在学习的过程中并不是特别困难,对UI CODED TEST也已经有一定了解.本着与大家交流,共同进步的想法,思考之后,决定写这些随笔,来对VS2010的测试功能做一些探索和总结.希望大家能够多多指教! 自动化测试 自动化测试指软件测试的自动化,软件测试

一起谈.NET技术,VS2010测试功能之旅:编码的UI测试(1)

前言 研究VS2010的自动化测试有一段时间了,在研究的过程中,发现网上的VS2010相关的测试资料十分稀少,这给学习带来比较大的困难.幸运的是,自己因为常用QuickTest Professional做自动化测试,并且对.Net代码比较了解,使得在学习的过程中并不是特别困难,对UI CODED TEST也已经有一定了解.本着与大家交流,共同进步的想法,思考之后,决定写这些随笔,来对VS2010的测试功能做一些探索和总结.希望大家能够多多指教! 自动化测试  自动化测试指软件测试的自动化,软件测

VS“.NET研究”2010测试功能之旅:编码的UI测试(1)

前言 研究VS2010的自动化测试有一段时间了,在研究的过程中,发现网上的VS2010相关的测试资料十分稀少,这给学习带来比较大的困难.幸运的是,自己因为常用QuickTest Professional做自动化测试,并且对.Net代码比较了解,使得在学习的过程中并不是特别困难,对UI CODED TEST也已经有一定了解.本着与大家交流,共同进步的想法,思考之后,决定写这些随笔,来对VS2010的测试功能做一些探索和总结.希望大家能够多多指教! 自动化测试  自动化测试指软件测试的自动化,软件测

VS2010 测试功能之旅:编码的UI测试(4)-通过编写测试代码的方式“.NET研究”建立UI测试(下)

回顾 最近比较忙,距离上次更新的时间较久,见谅. 在本章上部分,介绍了"添加用户"窗口的测试代码编写.想必大家也看到了,在UIMap.cs文件中实现自定义编码是一件很轻松的事情,接下来将介绍下个部分,查询用户窗体的测试代码的编写,以及他们测试的关联. 示例程序介绍 系统主窗口:(下载点我) 该系统拥有两个功能,"添加用户"和"查询用户": 点击添加用户后,进入添加用户子窗体:("添加用户"窗口的测试代码编写在上部分已经实现)

VS2010测试功能之旅:编码的“.NET研究”UI测试(2)-操作动作的录制原理(上)

回顾  在之前我们介绍了如何用VS2010的UI测试功能创建一个简单的示例,大致描述了如何使用编码的UI测试进行录制和回放,在这章会着重描述VS2010是如何录制操作,并且生成代码,以及初步介绍如何通过自己写代码的方式进行测试. 内容简介  在上一章我们已经介绍过,建立一个编码的UI测试CodedUITest1.cs,录制完成之后,会自动生成一个UIMap1.uitest文件.  图1:录制完成后自动生成的UIMap1.uitest文件  事实上,在录制过程中起着关键作用的并非是CodedUIT

VS2010 测试功能之旅:编码的UI测试(4)-通“.NET研究”过编写测试代码的方式建立UI测试(上)

回顾 在之前的入门篇系列中,分别介绍了一个简单的示例, 操作动作的录制原理,通过修改UIMap.UItest文件控制操作动作代码的生成,对象的识别原理.接下来正式进入我们UI测试的进阶篇,在这一章,将讲述如何初步通过自己编写代码的方式来建立UI测试. 示例程序 一个系统的基本功能是增,删,改,查,其中增和改界面基本一样,删就几乎是一个按钮的事,所以我做了一个程序示例(下载点我),拥有增和查两个功能,之后的操作都将会在这个示例之上进行: 系统主窗口: 该系统拥有两个功能,"添加用户"和&

一起谈.NET技术,VS2010 测试功能之旅:编码的UI测试(4)-通过编写测试代码的方式建立UI测试(下)

回顾 最近比较忙,距离上次更新的时间较久,见谅. 在本章上部分,介绍了"添加用户"窗口的测试代码编写.想必大家也看到了,在UIMap.cs文件中实现自定义编码是一件很轻松的事情,接下来将介绍下个部分,查询用户窗体的测试代码的编写,以及他们测试的关联. 示例程序介绍 系统主窗口:(下载点我) 该系统拥有两个功能,"添加用户"和"查询用户": 点击添加用户后,进入添加用户子窗体:("添加用户"窗口的测试代码编写在上部分已经实现)

一起谈.NET技术,VS2010测试功能之旅:编码的UI测试(2)-操作动作的录制原理(上)

回顾  在之前我们介绍了如何用VS2010的UI测试功能创建一个简单的示例,大致描述了如何使用编码的UI测试进行录制和回放,在这章会着重描述VS2010是如何录制操作,并且生成代码,以及初步介绍如何通过自己写代码的方式进行测试. 内容简介  在上一章我们已经介绍过,建立一个编码的UI测试CodedUITest1.cs,录制完成之后,会自动生成一个UIMap1.uitest文件.  图1:录制完成后自动生成的UIMap1.uitest文件  事实上,在录制过程中起着关键作用的并非是CodedUIT

一起谈.NET技术,VS2010测试功能之旅:编码的UI测试(3)-操作对象的识别原理

回顾  在之前的两章分别介绍了一个简单的示例, 操作动作的录制原理,通过修改UIMap.UItest文件控制操作动作代码的生成.想必大家对编码的UI测试操作动作的录制应该有一定了解了,在UI操作中,操作动作总是离不开具体的操作对象,例如点击,拖动,填写值等操作,总是要对文本框,或者按钮,窗体这些对象进行操作,不是凭空生成的.本章作为入门篇的最后一章,将会说明编码的UI测试是如何识别这些对象的,并介绍UIMap.UItest文件是如何生成对象识别代码. 对象的识别原理 之前我们录制的时候,录制生成