Microsoft UI 自动化库

发表于:2008-10-08 15:34

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Dr. James McCaffrey    来源:MSDN

  可以使用多种技术测试 Windows® 应用程序的用户界面。例如,可以使用 System.Reflection 类来测试 Microsoft® .NET Framework 应用程序,也可以使用非托管 C++、C# 或者 Visual Basic® 通过 P/Invoke 机制调用 Win32® API 函数(例如 FindWindow)来测试 .NET 和本机应用程序。

  在本月的专栏中,我将为您介绍如何使用新的 Microsoft UI 自动化库(包含在 .NET Framework 3.0 中,是 Windows Presentation Foundation (WPF) 的一部分)开始进行 UI 测试自动化。您可以将其看作是 Microsoft Active Accessibility (MSAA) 库的后继产品,后者最初设计用于可访问性功能,但同时发现它对 UI 自动化很有用也很适合。另一方面,UI 自动化库从一开始就是为可访问性和 UI 测试自动化任务而专门设计的。您可以使用 UI 自动化库来测试运行支持 .NET Framework 3.0 的操作系统(例如 Windows XP、Windows Vista®、Windows Server® 2003 和 Windows Server 2008)的主机上的 Win32 应用程序、.NET Windows 窗体应用程序和 WPF 应用程序。

  言归正传,我认为 UI 自动化库的开发是迄今为止测试自动化领域中最重大的一项进步,并将迅速成为 Windows 应用程序 UI 测试自动化方面最常用的技术。与其他用于 UI 自动化的可选方法相比,UI 自动化库功能更强大、往往更易于使用并且更加一致。就像 .NET Framework 改变了软件应用程序开发一样,我认为 UI 自动化库极有可能会彻底改变 UI 测试自动化。

  向您阐述我的观点的一个好方法是通过屏幕快照。图 1 显示的是我将要测试的一个简单的 Windows 应用程序。该应用程序被称为 StatCalc,它可以计算一组整数的算术平均数、几何平均数或调和平均数。算术平均数只是简单的平均。例如,30 英寸和 60 英寸的算术平均数是 45 英寸。几何平均数用于比例。例如,30:1 和 60:1 的几何平均数是 42.4264:1。调和平均数用于比率。例如,在超过某一固定距离时 30 英里/小时和 60 英里/小时的平均数为 40 英里/小时。

  

  图 1 UI 测试自动化中的示例应用程序)

  图 1 中所示的 UI 测试自动化是一个控制台应用程序,它可以启动所测试的应用程序,使用 UI 自动化库获取对应用程序中的应用程序控件和用户控件的引用,模拟用户输入 30 和 60,以及模拟单击“Calculate”(计算)按钮控件。然后测试自动化通过检查结果 TextBox 控件是否为预期值来查看应用程序的最终状态,并在随后输出“通过”或“失败”结果。我在测试自动化关闭所测试的应用程序之前捕获屏幕快照。

  在本专栏的其余部分中,我将简要介绍所测试的 StatCalc Windows 应用程序,并将说明如何启动所测试的应用程序;如何使用 UI 自动化库获得对应用程序控件和用户控件的引用;以及如何模拟用户操作和查看应用程序状态。我还将为您介绍如何扩展和修改此处介绍的测试系统以满足您的自身需求。我相信您会发现能够使用此新的 UI 自动化库对您的测试工具集是一个很好的补充。

  了解 StatCalc

  让我们简要了解一下所测试的应用程序,从而使您了解测试自动化的目标。您还将了解为什么说在编写 UI 测试自动化时能够访问应用程序源代码很有用,而又不是绝对必要的。

  StatCalc 应用程序是一个简单的基于 Windows 的窗体。我使用 C# 为应用程序编写代码,不过 UI 自动化库也可以与 Win32 应用程序和 WPF 应用程序配合工作。为了简单起见,我接受 Visual Studio® 的默认控件名称,包括 Form1、label1、textBox1、groupBox1、radioButton1、radioButton2、radioButton3、 button1 和 textBox2。我使用 MenuStrip 控件(在 .NET Framework 2.0 及更高版本中提供),而非早期的 MainMenu 控件,增加了顶层菜单项:“File”(文件)和“Help”(帮助)。StatCalc 应用程序的功能包含在 button1_Click 方法中,如Figure 2 所示。

  Figure 2 StatCalc 应用程序代码

  private void button1_Click(object sender, EventArgs e) {
  string[] sVals = textBox1.Text.Split(' ');
  int[] iVals = new int[sVals.Length];
  for (int i = 0; i < iVals.Length; ++i)
  iVals[i] = int.Parse(sVals[i]);

 if (radioButton1.Checked) {
  double sum = 0.0;
  foreach (int v in iVals)
  sum += v;
  double result = (double)(sum / iVals.Length);
  textBox2.Text = result.ToString("F4");
  }
  else if (radioButton2.Checked) {
  double product = 1.0;
  foreach (int v in iVals)
  product *= (double)v;
  double result = NthRoot(product, iVals.Length);
  textBox2.Text = result.ToString("F4");
  }
  else if (radioButton3.Checked) {
  double sum = 0.0;
  foreach (int v in iVals)
  sum += (1/ (double)v);
  double result = (double)(iVals.Length / sum);
  textBox2.Text = result.ToString("F4");
  }
  }

  用户单击“Calculate”(计算)按钮时,控制权转至 button1_Click 方法,该方法将 textBox1 中的值提取为单字符串。然后使用 String.Split 方法将每个值解析为字符串数组。接着,单击处理程序将字符串数组转换为整型数组。Button1_Click 逻辑将根据选择的单选按钮控件构造分支,以 double 类型计算相应的平均数,然后将结果的格式设置为四个小数位的字符串形式,显示在 textbox2 控件中。

  在计算几何平均数时,应用程序将调用名为 NthRoot 的本地 helper 方法,定义如下:

  private static double NthRoot(double x, int n) {
  return Math.Exp( Math.Log(x) / (double)n );
  }

  在此未执行任何常规错误检查,以确保应用程序代码尽可能的小并且易于理解。

  作为经验之谈,在使用 UI 自动化库编写测试自动化时,不需要访问所测试系统的源代码。大多数情况下,可以通过控件的标题(例如 Calculate)而不是通过控件的内部 Name 属性(例如 button1)访问控件。但是,某些控件(例如,文本框控件)没有标题。

  若要使用 UI 自动化访问没有标题的控件,必需知道它们隐含的索引顺序。这一顺序是初始化窗体时控件加载到主窗体控件(或父控件)中的顺序。隐含的索引顺序不一定要与设计时将控件添加到窗体对象中的顺序一样,而且它与选项卡索引顺序也不一样。

  通过查看应用程序源代码可以很容易地确定没有标题的控件的隐含索引顺序。例如,如果我检查 StatCalc 应用程序的 Form1.Designer.cs 文件并展开 Windows 窗体设计器生成的代码区,可以看到以下代码:

  this.Controls.Add(this.button1);
  this.Controls.Add(this.groupBox1);
  this.Controls.Add(this.label1);
  this.Controls.Add(this.textBox2);
  this.Controls.Add(this.textBox1);
  this.Controls.Add(this.menuStrip1);

51/512345>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号