7.0 导读
本章所讲述的技术展示了如何通过调用底层API函数来实现Web UI测试。这些技术与第6章讲到的内容紧密相关,所不同的是,第6章的技术通过JavaScript调用Internet Explorer Document Object Model(IE DOM)来操纵Web页面的客户区域。而本章的技术则更为强大一些,也就是说,我们可以对自动化测试有更多的控制权,并且这种方法也更为灵活。通过这些技术,可以完成更为复杂的UI测试。这些底层技术的核心就是,通过直接调用mshtml.dll和shdocvw.dll库来访问并且操纵IE客户区域的HTML对象。尽管这些技术已经存在好几年了,但是在.NET诞生之前,只能通过编写复杂的COM代码来使用这些技术。.NET环境极大地降低了通过这些底层技术编写自动化测试代码的难度。图7-1显示了一个底层Web UI测试场景的运行情况。

图7-1 底层Web UI测试
从图7-1我们可以看到这个测试套件是一个控制台程序。测试套件运行IE浏览器的一个实例并且连接到这个IE实例,然后把待测Web页面加载到浏览器,操纵浏览器并模拟用户实施一个搜索操作,然后检查程序的状态以判定测试场景通过与否。
本章的许多技术都引用到了图7-1所示的Web程序。这个程序是通过Visual Studio .NET 2003创建的,它的名称是默认的WebForm1.aspx。该程序由3个Label控件,一个RadioButtonList控件、一个TextBox控件,一个Button控件和一个ListBox控件。为了简单起见,所有这些控件都采用Visual Studio给出的默认名称:Label1、Label2、Button1,等等。显然,你所碰到的待测Web程序会比这里给出的例子复杂得多,但是这个演示程序包含所有用于描述底层Web UI测试的关键技术。这个Web程序在一堆数据里搜索指定的产品信息,它以产品ID作为过滤字段。实际的Web程序可能会通过一个SQL数据库来搜索产品信息。但是,我们的演示程序只是查找本地的一堆数据,这些数据是作为一个存储Product对象的ArrayList来实现的。本地的Product类定义如下:
class Product
{
public string name;
public string id;
public double price;
public Product(string name, string id, double price)
{
this.name = name;
this.id = id;
this.price = price;
}
}
当加载Web程序时,会创建一堆数据:
private System.Collections.ArrayList al =
new System.Collections.ArrayList();
private void Page_Load(object sender, System.EventArgs e)
{
Product p1 = new Product("widgets", "1A11A", 11.11);
Product p2 = new Product("gadgets", "2B22B", 22.22);
Product p3 = new Product("foozles", "3C33C", 33.33);
al.Add(p1);
al.Add(p2);
al.Add(p3);
Label3.Visible = false; // "Search Complete"消息
}
待测Web程序搜索功能的主要代码如下:
private void Button1_Click(object sender, System.EventArgs e)
{
ListBox1.Items.Clear();
string filter = TextBox1.Text;
ListBox1.Items.Add("ProdName ProdID Price");
ListBox1.Items.Add("=====================");
if (RadioButtonList1.SelectedValue == "Name")
{
foreach (Product p in al)
{
if (p.name.IndexOf(filter) >= 0)
ListBox1.Items.Add(p.name + ", " + p.id + ", " + p.price);
}
}
else if (RadioButtonList1.SelectedValue == "ID")
{
foreach (Product p in al)
{
if (p.id.IndexOf(filter) >= 0)
ListBox1.Items.Add(p.name + ", " + p.id + ", " + p.price);
}
}
Label3.Visible = true;
}
当通过UI测试某个程序时,在何处以及如何判定新的程序状态并不是非常重要。换句话说,对于UI测试,你并不关心待测程序是通过SQL数据库,还是文本文件或者本地的一堆数据来进行搜索的。针对应用程序所实施的每一个用户操作(例如,单击Search按钮)最终都会导致程序状态的变化,而这些变化又会通过UI反映出来(例如,ListBox控件所显示的文本)。像这种无法访问到AUT/SUT源代码的情况,经常被称为黑盒测试(black box testing)。如果可以访问全部的源代码,则通常称为白盒测试(white box testing)。这两个术语以及它们的变种,比如灰盒测试(gray box testing)和亮盒测试(clear box testing),可能是软件测试领域使用最为频繁的一些术语。这些术语本身并不重要,但是它们所隐含的一些原则可以帮助我们确定针对某些类型的测试,会碰到的一些限制。例如,对于黑盒测试的情况,在创建测试用例的时候,必须依赖通用的一些测试原理;而对于白盒测试的情况,则可以针对待测系统中某个特定的代码路径创建特殊的测试用例。
与此相关,但是更为高层的Web UI测试技术在第6章中已经讲述。第6章的技术通过IE DOM来访问Web程序的客户区域。你可以把IE DOM想象成对mshtml.dll和shdocvw.dll库函数
的一个包装(wrapper)。本章的技术之所以被称为底层技术是因为它们直接调用mshtml.dll和shdocvw.dll的函数,从效果上看,它所进行的操作要比第6章的技术低一个层次。通过本章所讲解的技术,再结合第3章中的技术,就可以访问一个Web程序的所有区域——客户区域、浏览器外壳(browser shell),以及外部窗体。图7-1所示的测试套件的源码清单见7.9节。







