在本月的专栏中,我将为您介绍如何使用新的 Microsoft UI 自动化库(包含在 .NET Framework 3.0 中,是 Windows Presentation Foundation (WPF) 的一部分)开始进行 UI 测试自动化。您可以将其看作是 Microsoft Active Aclearcase/" target="_blank" >ccessibility (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");
}