对于Web应用程序来说,最基本的测试类型就是“请 求-响应(request-response)”测试。我们可以通过程序发送一个HTTP请求给Web服务器,Web服务器处理完这个请求之后会发送回来 一个HTTP响应(通常以HTML页面的形式),我们可以捕获这个响应,然后检查它与期望值是否一致。请求和响应的动作通常总是一并出现的,对于轻量级的 自动化测试来说,通常不会发送一个HTTP请求而不取回随后的响应,或者说如果某个HTTP请求不是由你发起的,你也不大会取回与这个HTTP请求对应的 HTTP响应。因此,本章的大多数技术都是告诉你如何发送一个HTTP请求并且取回随后的HTTP响应,或者如何根据期望值检查某个HTTP响应。考虑图 5-1所示的一个简单的ASP.NET Web应用程序:
图5-1 待测Web程序
图5-1所示的Web应用程序,其源代码如下:
<html>
<head>
<script language="c#" runat="server">
void Button1_Click(object sender, System.EventArgs e)
{
TextBox1.Text = "You picked " + DropDownList1.SelectedValue;
}
</script>
</head>
<body>
<h3>Request-Response</h3>
<form id="Form1" method="post" runat="server">
<p>Choose one:
<asp:DropDownList id="DropDownList1" runat="server">
<asp:ListItem Value="red">red</asp:ListItem>
<asp:ListItem Value="blue">blue</asp:ListItem>
<asp:ListItem Value="green">green</asp:ListItem>
</asp:DropDownList>
<p><asp:Button id="Button1" text="Send" onclick=
"Button1_Click" runat="server" />
<p><asp:TextBox id="TextBox1" runat="server" /></p>
</form>
</body>
</html>
请注意,为了简单起见,用C#表示的逻辑代码和 HTML的显示代码都放到了一个文件里,而没有采用更为常用的方法通过ASP.NET的代码隐藏(code-behind)机制(当使用Visual Studio .NET创建Web应用程序时,采用的就是这种机制)把它们存放到不同的文件里。这个ASP.NET Web应用程序是用C#来编写的,但是本章所讲解的“请求-响应”测试技术,对于任何兼容于.NET的语言编写的ASP.NET应用程序都是适用的。
如果手工来测试这个程序,需要从下拉框列表选择一 种颜色,然后单击Send按钮。从下拉框里选择的这个值会作为HTTP请求的一部分发送给ASP.NET Web服务器。服务器会处理这个请求并且返回一个HTTP响应。这个响应会发回给客户端的Internet浏览器(IE),在这里,返回的HTML响应以 图5-1所示的更为友好的方式呈现出来。我们必须检查最终的结果以确定HTTP响应的正确性(在本例中,要验证文本框控件中消息)。采用这种方式通过手工 来测试Web应用程序不仅速度慢,而且效率不高,容易出错并且单调乏味。好一点的做法是通过编写轻量级的自动化测试程序来进行测试。
针对“请求-响应”的自动化测试程序通过编程的方式发送一个HTTP请求,这个请求包含的信息与用户通过选择下拉框列表得到的结果是一样的,此外,测试程序通过检查HTTP响应所返回的特定数据,判定这个响应是否正确,例子见图5-2。
图5-2 Request-Response测试运行情况
.NET框架提供了三种基本方法和两种底层的方法用来发送HTTP请求和取回对应的HTTP响应。下面我们按照从最容易使用但是最不灵活,到最不容易使用但最为灵活的顺序,列出发送和取回HTTP数据的5种方法:
l WebClient:使用极为简单但是不能发送认证信息。
l WebRequest -WebResponse:赋予你更大的灵活性,包括发送认证信息的能力。
l HttpWebRequest -HttpWebResponse:更为复杂,但是赋予你更多的控制能力。
l TcpClient:你可以使用的一个底层类,但是对于轻量级的“请求-响应”自动化测试程序来说,除了一些极为罕见的场景,其他时候都是不需要的。
l Socket:非常底层的一个类,在自动化测试程序里不常用到。
.NET框 架还提供了一个HttpRequest类,但是这个类是一个基类,并不适合直接使用。本章的这些技术用到了三种较高层次的类(WebClient、 WebRequest-WebResponse和HttpWebRequest-HttpWebResponse)。