转自他人博客
使用 UI 自动化验证代码
Visual Studio 2013
驱动器通过其用户界面 (UI) 的应用程序的自动化的测试称为编码的 UI 测试的 (CUITs)。 这些测试包括用户界面控件的功能测试。 它们使您可以验证整个应用程序,包括其用户界面,能正常工作。 没有验证或在用户界面中,例如在网页中的其他逻辑时,编码的 UI 测试将特别有用。 他们还经常用于自动执行现有手动测试。
下面的插图所示,一种典型的开发体验可能位置,开始时,您只需生成您的应用程序 (F5) 然后单击通过 UI 控件,以验证操作正常工作。 您可能决定创建编码的测试,以使您不需要继续进行手动测试应用程序。 根据正在测试您的应用程序中的特定功能,您可以编写功能测试,或可能存在也可能不包含测试的 UI 级别集成测试的代码。 如果您只是想要直接访问某些业务逻辑,则可能会对单元测试进行编码。 但是,在某些情况下,非常有益,包括测试应用程序中的各种用户界面控件。 编码的 UI 测试可以自动执行初始的 (F5) 方案中,验证该代码改动不会影响您的应用程序的功能。
创建编码的 UI 测试可以很容易。 您只需测试手动执行时在后台运行 CUIT 测试生成器。 您还可以指定在特定字段中应显示哪些值。 CUIT 测试生成器记录您的操作,并从其生成的代码。 创建测试后,您可以专门的编辑器,您可以修改的操作序列中编辑它。
或者,如果您有一个已记录在 Microsoft 测试管理器中的测试用例,您可以从所生成代码。 有关详细信息,请参阅 录制和播放手动测试.
专用的 CUIT 测试生成器和编辑器方便地创建和编辑编码的 UI 测试,即使您主要技能概括起来可以分为测试,而不是编写代码。 但是,如果您是开发人员,您想要更高级的方式扩展测试,因此很容易复制和修改所构建的代码。 例如,可能记录测试采购处网站,然后编辑生成的代码中添加一个循环,购买了很多项目。
要求
- Visual Studio 旗舰版, Visual Studio 高级专业版
- 创建编码的 UI 测试项目。
在编码的 UI 测试项目中都必须包含编码的 UI 测试。 如果您尚没有编码的 UI 测试项目,则创建一个。 在解决方案资源管理器,在解决方案的快捷方式菜单中选择 添加, 新项目 ,然后选择任何一个 Visual Basic 或 Visual C#。 接下来,选择测试, 编码的 UI 测试。
- 我看不到编码的 UI 测试项目模板。
您可能正在使用的版本的Microsoft Visual Studio 2012不支持编码的 UI 测试。 若要创建编码的 UI 测试,则必须使用Visual Studio 旗舰版或 Visual Studio 高级专业版.
- 我看不到编码的 UI 测试项目模板。
- 添加一个编码的 UI 测试文件。
如果您只是创建编码的 UI 项目,第一个 CUIT 文件会自动添加。 若要添加另一个测试文件,打开编码的 UI 测试项目的快捷菜单,指向添加,然后选择 编码的 UI 测试。
在的编码的 UI 测试生成的代码 对话框中,选择 录制操作、 编辑 UI 映射或添加断言。
编码的 UI 测试生成器显示,Visual Studio 已最小化。
-
录制一系列操作。
若要开始录制,选择 记录图标。 执行您要测试应用程序,包括根据需要启动该应用程序中的操作。
例如,如果您要测试的 web 应用程序,您可能启动浏览器、 导航到 web 站点中,和登录到应用程序。
暂停录制到的示例,您必须处理的传入邮件,如果选择、 暂停。
删除行动 错误地录制,请选择 编辑操作。
若要生成代码 ,将复制您的操作,请选择 生成代码图标和类型的名称和说明的编码的 UI 测试方法。
- 验证用户界面 (如文字框的字段中的值。
选择添加断言在编码的 UI 测试生成器,然后选择您正在运行的应用程序中的 UI 控件。 显示的属性列表中选择一个属性,例如, 文本在一个文本框中。 在快捷菜单中,选择添加断言。 在对话框中,选择比较运算符,比较值和错误消息。
关闭断言窗口,然后选择生成代码。
提示
记录操作和验证值之间切换。 生成代码的操作或验证每个序列的末尾。 如果需要,您将能够后面插入新的操作和验证。有关更多详细信息,请参阅正在验证的控件的属性。
- 查看生成的测试代码。
若要查看生成的代码,请关闭用户界面测试生成器窗口。 在代码中,您可以看到您赋予每个步骤的名称。 该代码是您创建的 CUIT 文件中:
[CodedUITest] public class CodedUITest1 { ... [TestMethod] public void CodedUITestMethod1() { this.UIMap.AddTwoNumbers(); this.UIMap.VerifyResultValue(); // To generate more code for this test, select // "Generate Code" from the shortcut menu. } }
- 添加更多操作和断言。
将光标放在该测试方法中的适当时刻,然后在快捷菜单中,选择为编码的 UI 测试生成代码。 将在该位置插入新代码。
- 编辑明细的测试操作和断言的。
打开 UIMap.uitest。 此文件将打开在编码的 UI 测试编辑器中,在其中您可以编辑任何录制操作的序列,以及编辑断言。
有关详细信息,请参阅 使用编码的 UI 测试编辑器编辑编码的 UI 测试.
- 运行测试。
使用测试资源管理器中,或在测试方法中,打开快捷菜单,然后选择运行测试。 有关如何运行测试的详细信息,请参阅用测试资源管理器运行单元测试和 正在运行编码的 UI 测试的其他选项 在 接下来是什么?本主题结尾部分。
本主题中的其余部分提供了有关此过程的步骤的更多详细信息。
有关更详细的示例,请参见 演练:创建、编辑和维护编码的 UI 测试. 在本演练中,您将创建一个简单的 Windows Presentation Foundation (WPF) 应用程序,演示如何创建、 编辑和维护编码的 UI 测试。 本演练提供了更正已断开各种计时问题和控件重构的测试的解决方案。
启动和停止所测试的应用程序
我不想启动和停止我的应用程序、 浏览器或单独为每个测试的数据库。 如何避免它?
- 如果不希望录制启动受测应用程序的操作,您必须启动您的应用程序,在选择之前记录图标。
- 在测试结束时,在其中运行测试的进程将终止。 如果您在测试中启动您的应用程序,应用程序通常会关闭。 如果您不希望测试来关闭您的应用程序退出时,必须将.runsettings 文件添加到您的解决方案和使用KeepExecutorAliveAfterLegacyRun选项。 有关详细信息,请参阅 使用 .runsettings 文件配置单元测试.
- 您可以添加测试初始化方法中,[TestInitialize] 属性,每个测试方法的开头运行代码的标识。 例如,可以从 TestInitialize 方法来启动应用程序。
- 您可以添加一个测试清理方法 [TestCleanup] 属性,在每个测试方法的末尾运行代码的标识。 例如,可以从 TestCleanup 方法调用方法来关闭应用程序。
正在验证用户界面控件的属性
您可以使用编码的 UI 测试生成器 添加到一个用户界面 (UI) 控件 UIMap为您的测试,或生成断言用于用户界面控件的验证方法的代码。
若要为您的 UI 控件生成断言,请选择添加断言在编码的 UI 测试生成器和拖动到该控件上您想要验证的受测应用程序是否正确的工具。 在框中列出了您的控件,请释放鼠标。该控件类代码,则立即创建在UIMap.Designer.cs文件。
此控件的属性中现在列出添加断言对话框。
导航到某一特定控件的另一种方法是选择箭头 (<<) 展开视图的 UI 控件图。 若要查找父控件、 同级或子控件,可以在地图上的任意位置单击,并使用箭头键在树中移动。
- 我在我的应用程序中,选择一个控件,或看不到 UI 控件图中的控件时,看不到任何属性。
在应用程序代码中,您要验证的控件必须具有一个唯一的 ID,例如 HTML ID 属性或 WPF UId。 您可能需要更新的应用程序代码中添加这些 Id。
接下来,打开快捷菜单上的验证,然后再指向所需的 UI 控件的属性添加断言。 在添加断言 对话框中,选择 比较运算符 为断言,例如 AreEqual,然后键入值中断言 比较值。
为测试添加完所有断言,选择确定。
若要为断言生成代码并将控件添加到 UI 映射,请选择生成代码图标。 输入编码的 UI 测试方法的名称和说明的方法,将被添加为注释的方法。 选择添加并生成。 接下来,选择关闭 图标以关闭 编码的 UI 测试生成器。 这将生成与以下代码类似的代码。 例如,如果您输入的名称是 AssertForAddTwoNumbers,代码将类似于以下示例:
- 向编码的 UI 测试文件中的测试方法调用 assert 方法 AssertForAddTwoNumbers:
[TestMethod] public void CodedUITestMethod1() { this.UIMap.AddTwoNumbers(); this.UIMap.AssertForAddTwoNumbers(); }
您可以编辑此文件,若要更改顺序的步骤和断言,或创建新的测试方法。 若要添加更多代码,请将光标上测试方法,并在快捷菜单上选择为编码的 UI 测试生成代码。
- 添加一个方法调用AssertForAddTwoNumbers为您的 UI 映射 (UIMap.uitest)。 此文件将打开在编码的 UI 测试编辑器,可在其中编辑断言。
有关详细信息,请参阅 使用编码的 UI 测试编辑器编辑编码的 UI 测试.
在 UIMap.Designer.cs 中,您还可以查看生成的代码的断言方法。 但是,您不应该编辑此文件。 如果要使代码的改编的版本,将方法复制到另一个文件 (如 UIMap.cs、 重命名的方法,并对其进行编辑。
public void AssertForAddTwoNumbers() { ... }
- 我想要选择的控件失去焦点,并试图从编码的 UI 测试生成器中选择添加断言工具时,就会消失。 请不要选择该控件的方式
-
选择隐藏的控件,使用键盘有时,当中添加控件和验证其属性,您可能必须使用键盘。 例如,当您尝试记录编码的 UI 测试中使用上下文菜单控件,该控件中的菜单项的列表将失去焦点和消失,当您尝试从编码的 UI 测试生成器中选择添加断言工具。 在下图中,在 Internet Explorer 中的上下文菜单将失去焦点并消失,如果您尝试使用添加断言工具选择它说明了这一点。
若要使用键盘来选择 UI 控件,将鼠标悬停在该控件使用鼠标。 然后同时按住 Ctrl 键和 I 键。 松开键。 该控件由编码的 UT 测试生成器记录。
警告
如果您使用 Microsoft Lync,您必须关闭 Lync 之前开始编码的 UI 测试生成器。 Microsoft Lync 干扰 Ctrl + I 键盘快捷方式。 - 我不能录制鼠标悬停在控件上。 是否有解决办法吗?
-
手动录制鼠标悬停在某些情况下,某一特定控件,用于在编码的 UI 测试可能会要求您使用键盘手动记录的鼠标悬停事件。 例如,Windows 窗体或 Windows Presentation Foundation (WPF) 的应用程序测试时,可能有的自定义代码。 或者,可能有上悬停鼠标指针停留在控件,例如当用户悬停在其上扩展树节点定义的特殊行为。 若要测试上述情况下,您必须手动通知编码的 UI 测试生成器,按悬停控件预定义的键盘键。
执行编码的 UI 测试时,将鼠标指针悬停在控件上。 然后按住 ctrl 键,同时按住 Shift 和 R 键在键盘上。 松开键。 通过编码的 UT 测试生成器记录鼠标悬停事件。
生成测试方法之后,类似于下面的示例代码将添加到 UIMap.Desinger.cs 文件中:
// Mouse hover ‘1‘ label at (87, 9) Mouse.Hover(uIItem1Text, new Point(87, 9));
- 正在我的环境中其他地方使用捕获鼠标悬停事件的键分配方案。 可以更改默认键分配方案吗?
-
配置鼠标悬停键盘分配如有必要,则 Ctrl + Shift + R 用来将应用在编码的 UI 测试中的鼠标悬停事件的默认键盘分配都可以配置为使用不同的密钥。
警告
不需要更改键盘分配在一般情况下的鼠标悬停事件。 当重新分配键盘分配要格外小心。 您的选择可能已经在使用 Visual Studio 或正在测试的应用程序内的其他位置。若要更改键盘分配,您必须修改以下配置文件:
< 驱动器号: > \Program 文件 (x86) \Microsoft Visual Studio 11.0\Common7\IDE\CodedUITestBuilder.exe.config
在配置文件中,更改的值HoverKeyModifier和 HoverKey键来修改键盘分配:
<!-- Begin : Background Recorder Settings --> <!-- HoverKey to use. --> <add key="HoverKeyModifier" value="Control, Shift"/> <add key="HoverKey" value="R"/>
- 我有录制鼠标悬停在某个网站上的问题。 有一个修复程序,过吗?
-
Web 浏览器的设置隐式鼠标悬停在很多网站,当您将鼠标悬停在某一特定控件,它展开以显示更多详细信息。 通常情况下,它们看起来像桌面应用程序中的菜单。 因为这是一种常见模式,编码的 UI 测试将启用 Web 浏览的隐式悬停。 例如,如果您的记录上在 Internet Explorer 中,激发的事件。 这些事件可能会导致冗余悬停获取记录。 正因为如此,隐式悬停记录的ContinueOnError设置为 true的 UI 测试配置文件中。 这将允许播放继续如果悬停事件失败。
若要启用隐式悬停在 Web 浏览器中的记录,请打开配置文件:
< 驱动器号: > \Program 文件 (x86) \Microsoft Visual Studio 11.0\Common7\IDE\CodedUITestBuilder.exe.config
验证配置文件具有键RecordImplicitiHovers设置为的值的 true如下面的示例所示:
<!--Use this to enable/disable recording of implicit hovers.--> <add key="RecordImplicitHover" value="true"/>
创建编码的 UI 测试之后,您可以通过在 Visual Studio 中使用以下某种工具进行编辑:
- 编码的 UI 测试生成器: 使用编码的 UI 测试生成器向测试添加其他控件和验证。 请参见部分添加控件并验证其属性本主题中。
- 编码的 UI 测试编辑器: 编码的 UI 测试编辑器,可方便地修改编码的 UI 测试。 使用编码的 UI 测试编辑器,可以查找、 查看和编辑测试方法。 您可以同时编辑 UI 操作及其关联的控件在 UI 控件图中。 有关详细信息,请参阅 使用编码的 UI 测试编辑器编辑编码的 UI 测试.
- 代码编辑器:
- 手动添加测试中的各个控件的代码,如中所述编码 UI 控件操作和属性本主题中的部分。
- 创建编码的 UI 测试之后,可以修改其数据驱动。 有关详细信息,请参阅 如何:创建数据驱动的编码的 UI 测试.
- 在编码的 UI 测试播放中,您可以指示测试等待某些事件发生如某个窗口出现,进度栏会消失,依次类推。 若要执行此操作,添加适当的 UITestControl.WaitForControlXXX() 方法。 可用的方法的完整列表,请参阅 播放期间让编码的 UI 测试等待特定事件. 编码的 UI 测试等待使用 WaitForControlEnabled 方法启用控件的示例,请参见 演练:创建、编辑和维护编码的 UI 测试.
- 编码的 UI 测试包括对某些 Internet Explorer 9 和 Internet Explorer 10 中包括的 HTML5 控件的支持。 有关详细信息,请参阅 在编码的 UI 测试中使用 HTML5 控件.
- 编码的 UI 测试编码指南:
生成的代码
当您选择生成代码,创建几个代码段:
- 在测试方法中的行。
[CodedUITest] public class CodedUITest1 { ... [TestMethod] public void CodedUITestMethod1() { this.UIMap.AddTwoNumbers(); // To generate more code for this test, select // "Generate Code" from the shortcut menu. } }
您可以用鼠标右键单击此方法以添加其他录制的操作和验证。 您还可以编辑它手动来扩展或修改代码。 例如,无法将某些代码括在循环中。
此外可以添加新的测试方法,并向其中添加代码,以同样的方式。 每个测试方法必须具有[TestMethod]特性。
- UIMap.uitest 中的方法
这种方法包括您所记录的操作或您已验证的值的详细信息。 您可以通过打开 UIMap.uitest 编辑此代码。 您可以删除或重构的录制的操作的专用编辑器中打开。
在 UIMap.Designer.cs 中,您还可以查看生成的方法。 此方法执行运行测试时录制的操作。
// File: UIMap.Designer.cs public partial class UIMap { /// <summary> /// Add two numbers /// </summary> public void AddTwoNumbers() { ... } }
警告
因为它在您创建多个测试时,将重新生成,不应编辑此文件。您可以通过将其复制到 UIMap.cs 改编的版本,这些方法。 例如,可以使您可以从测试方法调用的参数化的版本:
// File: UIMap.cs public partial class UIMap // Same partial class { /// <summary> /// Add two numbers – parameterized version /// </summary> public void AddTwoNumbers(int firstNumber, int secondNumber) { ... // Code modified to use parameters. } }
- UIMap.uitest 中的声明
这些声明表示您测试所使用的应用程序的 UI 控件。 它们用于生成的代码操作控件,并访问其属性。
您还可以使用它们如果您编写自己的代码。 例如,您可以测试方法在 Web 应用程序中选择一个超链接,在文本框中,键入一个值或分支并采取不同的测试操作基于字段中的值。
您可以添加多个编码的 UI 测试和多个 UI 映射对象和文件以便测试大型应用程序。 有关详细信息,请参阅 使用多个 UI 映射测试大型应用程序.
有关所生成代码的详细信息,请参阅 编码的 UI 测试剖析.
编码的 UI 控件操作和属性
使用编码的 UI 测试中的 UI 测试控件时,它们被分成两部分: 操作和属性。
- 第一部分包括您可以对 UI 测试控件执行的操作。 例如,编码的 UI 测试可以模拟鼠标点击 UI 测试控件,或模拟影响 UI 测试控件的键盘上键入的键。
- 第二部分包含可用于获取和设置 UI 测试控件的属性。 例如,编码的 UI 测试可以获取中的项目数 ListBox,或设置 CheckBox为所选状态。
访问 UI 测试控件的操作
要执行对 UI 测试控件,如鼠标单击或键盘操作的操作使用方法在Mouse和 Keyboard类:
- 若要执行面向鼠标的操作如鼠标单击),对 UI 测试控件,请使用 Click.
Mouse.Click(buttonCancel);
- 若要执行面向键盘的操作如键入一个编辑控件,使用 SendKeys.
Keyboard.SendKeys(textBoxDestination, @"C:\Temp\Output.txt");
访问 UI 测试控件的属性
若要获取和设置 UI 控件的特定属性值,可以直接获取或设置控件的属性的值也可以使用UITestControl.GetProperty和 UITestControl.SetProperty与要获取或设置特定属性的名称的方法。
GetProperty 返回一个对象,然后可以转换为相应的 Type. SetProperty 接受的值的属性的对象。
要获取或直接从 UI 测试控件设置属性
- 与 T:Microsoft.VisualStudio.TestTools.UITesting.UITestControl,例如 T:Microsoft.VisualStudio.TestTools.UITesting.HtmlControls.HtmlList 或 T:Microsoft.VisualStudio.TestTools.UITesting.WinControls.WinComboBox,从派生的控件可以获取,或直接、,如下所示设置它们的属性值:
int i = myHtmlList.ItemCount; myWinCheckBox.Checked = true;
从 UI 测试控件获取属性
- 若要从控件获取属性值,请使用 GetProperty.
- 若要指定要获取的控件的属性,请使用适当的字符串,从PropertyNames类作为参数的每个控件中 GetProperty.
- GetProperty 返回相应的数据类型,但此返回值被强制转换为 Object. 返回Object然后可将强制转换为适当的类型。
示例:
int i = (int)GetProperty(myHtmlList.PropertyNames.ItemCount);
若要设置的属性的 UI 测试控件
- 若要在控件中设置的属性,请使用 SetProperty.
- 若要指定要设置控件的属性,请使用适当的字符串,从PropertyNames作为第一个参数的类 SetProperty,作为第二个参数的属性值。
示例:
SetProperty(myWinCheckBox.PropertyNames.Checked, true);
调试
您可以分析编码的 UI 测试中使用编码的 UI 测试日志。 编码的 UI 测试日志筛选器和运行编码的 UI 测试有关的重要信息的记录。 日志的格式,您可以快速调试的问题。 有关详细信息,请参阅 使用编码的 UI 测试日志分析编码的 UI 测试.