net软件测试自动化之道-it168文库_第1页
net软件测试自动化之道-it168文库_第2页
net软件测试自动化之道-it168文库_第3页
net软件测试自动化之道-it168文库_第4页
net软件测试自动化之道-it168文库_第5页
免费预览已结束,剩余44页可下载查看

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、CHAPTER 5第 5 章请求-响应测试Request-Response Testing5.0导读对于 Web 应用程序来说,最基本的测试类型就是“请求-响应(request-response)”测试。我们可以通过程序发送一个 HTTP 请求给 Web 服务器,Web 服务器处理完这个请求之后会发送回来一个 HTTP 响应(通常以 HTML 页面的形式),可以捕获这个响应,然后检查它与期望值是否一致。请求和响应的动作通常总是一并出现的,对于轻量级的自动化测试来说,通常不会发送一个 HTTP 请求而不取回随后的响应,或者说如果某个 HTTP 请求不是由你发起的,你也不大会取回与这个 HTTP

2、请求对应的 HTTP 响应。因此,本章的大多数技术都是告诉你如何发送一个 HTTP 请求并且取回随后的 HTTP 响应,或者如何根据期望值检查某个 HTTP 响应。考虑图 5-1所示的一个简单的 ASP.NET Web 应用程序:图 5-1 待测 Web 程序第 5 章 请求-响应测试136图 5-1 所示的 Web 应用程序,其源代码如下:void Button1_Click(objecder, System.EventArgs e)TextBox1.Text = You picked + DropDownList1.SelectedValue;Request-ResponseChoose

3、one:redbluegreen请注意,为了简单起见,用 C#表示的逻辑代码和 HTML 的显示代码都放到了一个文件里,而没有采用更为常用的方法通过 ASP.NET 的代码隐藏(code-behind)机制(当使用 Visual Studio .NET 创建 Web 应用程序时,采用的就是这种机制)把它们存放到不同的文件里。这个 ASP.NET Web 应用程序是用 C#来编写的,但是本章所讲解的“请求-响应”测试技术,对于任何兼容于.NET 的语言编写的 ASP.NET 应用程序都是适用的。如果手工来测试这个程序,需要从下拉框列表选择一种颜色,然后单击 Send 按钮。从下拉框里选择的这个值

4、会作为 HTTP 请求的一部分发送给 ASP.NET Web 服务器。服务器会处理这个请求并且返回一个 HTTP 响应。这个响应会发回给客户端的的 HTML 响应以图 5-1 所示的更为友好的方式呈现出来。ernet 浏览器(IE),在这里,返回须检查最终的结果以确定 HTTP响应的正确性(在本例中,要验证文本框控件中消息)。采用这种方式通过手工来测试 Web 应用程序不仅速度慢,而且效率不高,容易出错并且单调乏味。好一点的做法是通过编写轻量级的自动化测试程序来进试。针对“请求-响应”的自动化测试程序通过编程的方式发送一个 HTTP 请求,这个请求包含的信息与用户通过选择下拉框列表得到的结果是

5、一样的,此外,测试程序通过检查 HTTP 响应所返回的特定数据,判定这个响应是否正确,例子见图 5-2。5.0 导读137图 5-2 Request-Response 测试运行情况.NET 框架提供了三种基本方法和两种底层的方法用来发送 HTTP 请求和取回对应的 HTTP响应。下面按照从最容易使用但是最不灵活,到最不容易使用但最为灵活的顺序,列出发送和取回 HTTP 数据的 5 种方法:WebCnt:使用极为简单但是不能发送认证信息。WebRequest -WebResponse:赋予你更大的灵活性,包括发送认证信息的能力。HttpWebRequest -HttpWebResponse:更为

6、复杂,但是赋予你的控制能力。TcpCnt:你可以使用的一个底层类,但是对于轻量级的“请求-响应”自动化测试程序来说,除了一些极为罕见的场景,其他时候都是不需要的。Socket:非常底层的一个类,在自动化测试程序里不常用到。.NET 框架还提供了一个 HttpRequest 类,但是这个类是一个基类,并不适合直接使用。本章的这些技术用到了三种较次的类( WebCnt 、 WebRequest-WebResponse 和HttpWebRequest-HttpWebResponse)。TcpCnt 和 Socket 类在第 8 章介绍。图 5-2 所示的测试套件的源码参见 5.12 节。第 5 章

7、请求-响应测试1385.1发送一个简单的 HTTP GET 请求并且取回响应问题如何发送一个简单的 HTTP GET 请求并且取回相应的 HTTP 响应。设计创建一个 WebCnt 类的实例,然后使用它的 DownloadData()方法。方案string uri = ;WebCnt wc = new WebCnt();Console.Wriine(Sending an HTTP GET request to + uri); byte bResponse = wc.DownloadData(uri);string strResponse = Encoding.ASCII.GetString(b

8、Response); Console.Wriine(HTTP response is: );Console.Wriine(strResponse);注解WebCnt 类是 System.Net 命名空间的一部分,默认情况下对于控制台程序是可的。通过WebCnt.DownloadData()方法来取回一个 HTTP 响应是极为简单的,但是 DownLoadData()返回的只是一个字节数组(byte array),必须要通过 System.Text.Encoding.ASCII.GetString()方法把它转换成一个字符串。另string uri = 案是使用WebCnt.OpenRead()

9、方法并且把它与一个 stream 相关联:;WebCnt wc = new WebCnt();Console.Wriine(Sending an HTTP GET request to + uri); Stream st = wc.OpenRead(uri);StreamReader string res = sr.Close();st.Close(); Console.Wri Console.Wrisr = new StreamReader(st); sr.ReadToEnd();ine(HTTP Response is ); ine(res);相比于测试 ASP.NET Web 应用程序,

10、WebCnt 类更适合用来测试静态的 HTML 网页。这段代码可以用来检测 ASP.NET 程序发回的响应,但是要把这段代码扩展成自动化测试程序,你需要根据期望值来检查 HTTP 响应。5.8 节用到了本节的技术,在 5.8 节通过编程的方式来决定 ASP.NET Web 应用程序的 ViewS来检查一个 HTTP 响应。e 值。5.11 节所涉及的技术展示了如何根据给定的期望值5.2 发送带有认证信息的HTTP 请求并取回响应1395.2发送带有认证信息的 HTTP 请求并取回响应问题如何发送一个带有网络认证的 HTTP 请求并返回相应的 HTTP 响应。设计创建一个 WebRequest

11、对象和一个 NetworkCredential 对象。把 NetworkCredential 对象作为 WebRequest 对象的 Credentials 属性赋给它,并且通过 WebRequest.GetResponse()方法返回 HTTP 响应。方案string uri WebRequest= wreq = WebReq;reate(uri);string uid string pwd= some= theUserID; Password;Name;= new NetworkCredential(uid, pwd,string= theNetworkCredential nc);wre

12、q.Credentials = nc;Console.Wriine(Sending authenticated request to + uri); WebResponse wres = wreq.GetResponse();Stream st = wres.GetResponseStream();StreamReader string res =sr = new StreamReader(st); sr.ReadToEnd();sr.Close();st.Close(); Console.Wri Console.Wriine(HTTP Response is ); ine(res);注解如果

13、需要发送一个带有网络认证(用户 ID、域,以及)的 HTTP 请求 ,则可以使用 WebRequest 和 WebResponse 类。这些类位于 System.Web 命名空间,缺省情况下这个命名空间对于控制台程序来说是不可的,所以必须要添加一个关于 System.Web.dll 文件的工程引用。请注意,WebRequest 对象不是利用 new 关键字通过构造函数来创建的,而是利用工厂机制(factory mechanism)通过 Create()方法来创建的。创建 NetworkCredential 对象之后,可以把这个对象与 WebRequest 对象相关联。接下来调用 WebRequ

14、est.GetResponse()方法返回的是一个 WebResponse 对象;你可能预计需要显式地调用一个“Send”方法,实际上不需要。HTTP响应的数据流(stream),和其他数据流一样,可以被绑定到一个 StreamReader 对象上,然后你就可以通过 ReadToEnd()方法把整个 HTTP 响应作为一个字符串取回。第 5 章 请求-响应测试140WebRequest 和 WebResponse 类实际上都是抽象基类(abstract base classes)。在实际工作中,WebRequest-WebResponse 更适合用来处理相对较为简单的带认证信息的 HTTP 请

15、求。如果认证信息不是必需的,那么使用 WebCnt 类要更好一些。如果你需要发送一个 HTTPT 请求,那么 HttpWebRequest 和 HttpWebResponse 类通常是更好的选择。WebRequest 和 WebResponse类支持异步调用,但是对于轻量级的自动化程序来说,通常也用不到。本节的这些代码可以用来检查一个 ASP.NET 程序的响应,但是要将这部分代码扩展成一个自动化测试程序,则需要根据给定的期望值来检查 HTTP 响应,这种技术将在 5.11 节详述。5.3发送复杂的 HTTP GET 请求并且取回响应问题如何发送一个 HTTP GET 请求并且完全控制这个请求

16、的各项属性。设计创建一个 HttpWebRequest 类的实例,并通过 GetResponse()方法取回相应的 HTTP 响应。方案string uri = ;HttpWebRequest req = (HttpWebRequest)WebReq req.Method = GET;reate(uri);req.umAutomaticRedirections = 3;req.Timeout = 5000;Console.Wriine(Sending HTTP request);HttpWebResponse res = (HttpWebResponse)req.GetResponse();

17、Stream resst = res.GetResponseStream();StreamReader sr = new StreamReader(resst);Console.Wri Console.Wriine(HTTP Response is: ); ine(sr.ReadToEnd();sr.Close();resst.Close();注解对于轻量级的自动化测试程序来说,HttpWebRequest 和 HttpWebResponse 类是用于发送和接收 HTTP 数据的最好选择。它们支持一系列有用的属性。这两个类位于 System.Net 命名空间,默认情况下这个类对于控制台程序来说

18、是可的。请注意,HttpWebRequest 对象不是利用 new关键字通过构造函数来创建的,而是利用工厂机制(factory mechanism)通过 Create()方法来创建5.4 逐行返回 HTTP 响应的内容141的。另外,你可能预计需要显式地调用一个“ Send ”方法,实际上不需要。接下来调用 HttpWebRequest.GetResponse()方法返回的是一个 HttpWebResponse 对象。你可以把 HTTP 响应的数据流(stream)绑定到一个 StreamReader 对象,然后就可以通过 ReadToEnd()方法把整个 HTTP响应作为一个字符串取回。也可

19、以通过 StreamReader.ReadLine()方法逐行取回 HTTP 响应的内容。这种技术展示了如何限制请求重定向(request redirections)的次数, 并且设置了一个超时限制。下面是 HttpWebRequest 的一些属性,这些属性对于轻量级的自动化测试程序是非常重要的。AllowAutoRedirect:获取或设置一个值,该值指示请求是否应跟随重定向响应。Container:获取或设置与此请求关联的。Credentials:获取或设置请求的验证信息。ernet 资源建立持久性连接。KeepAlive:获取或设置一个值,该值指示是否与umAutomaticRedire

20、ctions:获取或设置请求将跟随的重定向的最大数目。Proxy:获取或设置请求的信息。SendCked:获取或设置一个值,该值指示是否将数据分段发送到ernet 资源。Timeout:获取或设置请求的超时值。UserAgent:获取或设置 User-agent HTTP 标头的值。每个属性的用途从它们的名称上来看都是显而易见的,并且有详细的文档来对它们进行描述,在需要用到它们的时候,可以查阅相关的文档。5.4逐行返回 HTTP 响应的内容问题如何逐行返回一个 HTTP 响应的内容,而不是把整个内容作为一个字符串。设计通过 HttpWebRequest.GetResponse()方法获得 HT

21、TP 响应的数据流(stream),并且把这个stream 传给StreamReader()的构造函数。然后在一个while 循环中通过StreamReader.ReadLine()方法进行逐行。方案/ 通过 WebCnt 类、WebRequest 类、或者 HttpWebRequest 类发送 HTTP 请求Stream st = null;第 5 章 请求-响应测试142/ 通过 WebCnt.OpenRead()方法、WebRequest.GetResponseStream()方法/ 或者 HttpWebRequest.GetResponse()把 Stream st 连接到 HTTP

22、响应StreamReader sr = new StreamReader(st); string line = null;Console.Wriine(HTTP response line-by-line: ); while (line = sr.ReadLine() != null)Console.Wriine(line);sr.Close();st.Close();注解用于发送 HTTP 请求的三种基本方法(WebCnt、WebRequest、HttpWebRequest)都支持通过某个方法以 Stream 对象的形式返回与它们相关联的 HTTP 响应。这个 Stream 对象可以与一个

23、StreamReader 对象相关联,而 StreamReader 对象可以有好几种方法取回流数据。使用 StreamReader.ReadToEnd()方法 ,可以把 HTTP 响应作为一个大字符串返回。对许多自动化测试场景来说,这样做就可以了,但是有时候你可能想要以每次一行的方式取回 HTTP 响应。比如说,如果返回的响应内容非常多,你可能不想把它在一个大字符串里。或者你想在 HTTP 响应里查找一个目标字符串,逐行查找有时候会更高效。如果要进行逐行查找,你可以在一个 while循环里使用 StreamReader.ReadLine() 方法。ReadLine()方法读入它所碰到的所有字符

24、,直到碰到换行符,然后返回。如果没有读到字符,它会返回 null。除了采取每次读入一行的方法来取回 HTTP 响应,也可以每次读入固定长度的一组字符:/ 把响应数据流连接到 Stream st/ 把 st 连接到 StreamReader srchar block = new char3; ct = 0;while (ct = sr.Read(block, 0, 3) != 0)for (i = 0; i ct; i+)Console.Write(blocki + );当想要按字符(而不是按行或字符串)来检查 HTTP 响应时,上面这段代码是很有用的。在这个例子中,首先一个大小为 3 的字符数

25、组用来取回的响应。StreamReader.Read()方法读入 3 个字符(如果数据流里3 个字符,则读入剩下的全部字符),并且把这些字符到5.5 发送简单的 HTTPT 请求给传统的 ASP 网页143从下标 0 开始的字符数组里面,然后返回实际读入的字符个数。如果读入字符的个数为 0,则意味着数据流已经读完,可以退出 while 循环了。请注意,如果把字符数组的大小为 1,则意味着每次读入 1 个字符。5.5发送简单的 HTTPT 请求给传统的 ASP 网页问题如何发送一个简单的HTTPT 请求给普通的ASP 网页/,并且返回相应的 HTTP 响应。设计创建 HttpWebRequest

26、 类的一个实例,设置这个对象的 Method 属性为“T”,ContentType属性为“ application/x-www-form-urlencoded ”。通过 GetRequestStream() 方法和 Stream.Write()为要发起的请求添加T 数据。然后通过 HttpWebRequest.GetResponse()方法取回相应的 HTTP 响应。方案string url = string data = inputBox1=orange;byte buffer = Encoding.ASCII.GetBytes(data);HttpWebRequest req = (Htt

27、pWebRequest)WebReqreate(url);req.Method = T;req.ContentType = application/x-www-form-urlencoded; req.ContentLength = buffer.Length;Stream reqst = req.GetRequestStream(); reqst.Write(buffer, 0, buffer.Length); reqst.Flush();reqst.Close();Console.Wriine(nting orange);HttpWebResponse res = (HttpWebResp

28、onse)req.GetResponse(); Stream resst = res.GetResponseStream();StreamReader sr = new StreamReader(resst);Console.Wri Console.Wri sr.Close();ine(nGrabbing HTTP responsen); ine(sr.ReadToEnd();resst.Close();Console.Wriine(Done);第 5 章 请求-响应测试144注解设想有一个如下的 HTML 网页:form name=theForm method=Enter color:t a

29、ction=classic.asp并且有一个与之相关的普通 ASP 网页/You submitted: Bye如果用户把网页加载到 classic.html 一个诸如 IE 这样的 Web 客户端,会显示一个“Entercolor:”提示和一个文本框。在输入一些文本并且单击submit 按钮之后,程序会发送一个包含HTML窗体数据的 HTTP 请求给 Web 服务器。Web 服务器会接受T 请求并且运行 classic.asp 脚本。这个把文本框里的值提取出来,并且把它到表示 HTML 结果的字节流(HTML resultstream),这个字节流随后会作为 HTTP 响应返回给客户端(在这里

30、 HTML 元素以友好的方式呈现出来)。直接向 classic.asp 页面/发送 HTTP 请求并返回 HTTP 响应,最为灵活的方法就是使用 HttpWebRequest 类。关键是首先要准备好用于发送的数据,这些数据以“名字-值”的字符串形式存在,并且用“&”连起来:string data = inputBox1=orange&inputBox2=green;接下来,必须使用 System. Text.Encoding.ASCII.GetBytes()方法把要发送的数据从字符串转换成一个字节数组,因为所有的 HTTP 数据都是以字节的形式来传送的。创建 HttpWebRequest对象之

31、后,必须把这个对象的“HttpWebRequest”属性设为“T”并且把 ContentTyp 属性设为“application/x-www-form-urlencoded”。你可以把 ContentType 值想象成一个特殊的字符串,这个字符串告诉 Web 服务器把收到的 HTTP 请求作为 HTML 窗体数据来。ContentLength5.6 发送HTTPT 请求给ASP.NET Web 应用程序145属性的值必须设为待发送数据的字节数组的长度。请注意因为要填充 ContentLength 的属性值,所以必须在创建 HttpWebRequest 对象之前准备好要发送的数据。准备好要发送的

32、请求以后,可以通过 HttpWebRequest.GetRequestStream()方法得到这个请求的数据流,然后就可以把要发送的数据加入这个数据流。通过下面这个语句就可以把要发送的数据写入数据流:reqst.Write(buffer, 0, buffer.Length);写入请求数据流的字节数组,以及从字节数组的什么位置作为开始,要写入多少个字节,都是由你来指定的。如果使用 Length 属性指定要写入的字节个数,将要写入请求数据流的就是整个字节数组。完成这些之后,就可以发送这个 HTTP 请求并且通过 StreamReader 对象以字符串的形式取回随后的 HTTP 响应。如果运行上述方

33、案,得到的输出如下:ting orangeGrabbing HTTP response:You submitted: orangeBye Done这种技术用到了HttpWebRequest 类和HttpWebResponse 类,但是你也可以使用WebCnt类或者 WebRequest 和 WebResponse 类。本节所讲述的技术适用于检查普通的 ASP Web 程序,但是要将这种技术扩展成自动化测试程序,你必须在 HTTP 响应中查找预先设定的期望值,将在 5.11 节进行。这种技术假定要“T”的数据字符串不包含任何可能被 Web 服务器错误地进行解释的特殊字符,比如空格和“&”。要处理

34、这些特殊字符,请参见 5.7 节的内容。这个方案还假定 HTTP请求-响应不穿越服务器。要处理有服务器的情况,请参见 5.6 节的注解部分。5.6发送 HTTPT 请求给 ASP.NET Web 应用程序问题如何发送 HTTPT 请求给 ASP.NET Web 应用程序并取回对应的响应。第 5 章 请求-响应测试146设计创建一个 HttpWebRequest 对象。把这个对象的“Method”属性设为“T”并且把ContentType 属性设为“application/x-www-form-urlencoded”。把 Web 程序的 ViewSe值加到T 数据字符串的后面。如果你的 Web

35、应用程序是基于 ASP.NET 2.0 的,你还必须把Web 程序的 EventValidation 值也加到方法和 Stream.Write() 方法把 T 数据的后面。然后,通过 GetRequestStream()数据添加 到要发送的 请求。接下 来,使用 THttpWebRequest.GetResponse()方法取回对应的 HTTP 响应。方案string url = ;string data = TextBox1=red&TextBox2=empty&Button1=clicked; string vs = dDwtMTQwNDA4NDA4ODs7PeWiylVlaimBKuqo

36、oykeHvDojL2i; vs = HttpUtility.UrlEncode(vs);data += & VIEWSE= + vs;byte buffer = Encoding.ASCII.GetBytes(data);HttpWebRequest req = (HttpWebRequest)WebReq req.Method = T;reate(url);req.ContentType = application/x-www-form-urlencoded; req.ContentLength = buffer.Length;Stream reqst = req.GetRequestSt

37、ream(); reqst.Write(buffer, 0, buffer.Length); reqst.Flush();reqst.Close();HttpWebResponse res = (HttpWebResponse)req.GetResponse(); Stream resst = res.GetResponseStream();StreamReader sr = new StreamReader(resst);Console.Wri Console.Wri sr.Close();ine(nGrabbing HTTP response:n); ine(sr.ReadToEnd();

38、resst.Close();Console.Wriine(Done);注解设想有一个名为 WebForm1.aspx 的 ASP.NET Web 程序如下:void Button1_Click(objecder, System.EventArgs e)5.6 发送HTTPT 请求给ASP.NET Web 应用程序147if (TextBox1.Text = red) TextBox2.Text = Roses are red;else if (TextBox1.Text = blue) TextBox2.Text = The sky is blue;elseTextBox2.Text = un

39、known color;Color Commenterform id=Form1 method=Enter color:t runat=serverMy comment:这个 Web 程序是通过手工创建的,而不是通过 Visual Studio .NET 生成的,如果采用后者,用 C#写的逻辑代码和用于 HTML 显示的代码会分开在不同的文件里。手工创建代码并不会影响自动化测试程序的运行。这个 Web 程序有两个文本框和一个按钮控件。用户在 TextBox1 控件里输入一个类似于“red”的字符串,然后单击 Button1 控件向 Web 服务器发送 HTTP 请求。ASP.NET Web 服

40、务器检查 TextBox1 的字符串值并且创建一个 HTTP 响应页面在 TextBox2 里显示类似于“Roses are red”这样的一条消息。上述方案的代码执行以后,输出结果如下:Sending TextBox1=redGrabbing the HTTP response:Color Commentert action=WebForm.aspx第 5 章 请求-响应测试148Enter color:My comment: Done请注意,带有 input的 TextBox2 的值为“Roses are red”。直接向 ASP.NET Web 程序发送 HTTP 请求并且取回响应,最灵

41、活的方法就是使用 HttpWebRequest 类。首先准备好用于发送的数据,这些数据以“名字-值”字符串的形式存在:string data = TextBox1=red&TextBox2=empty&Button1=clicked;“TextBox1=red”是显而易见的。待发送数据中的“TextBox2=empty”和“Button1=clicked”部分是为了让 ViewSe 值在客户端的自动化测试程序和 ASP.NET Web 服务器之间保持同步。每个 ASP.NET Web 程序都有一个 ViewSe 值,这个值代表每次“请求-响应”完成之后程序的状态。ViewSe 值是基于 Bas

42、e64 编码的一个字符串。通过创建并且一个 ViewSe 值,Web 服务器可以在连续的 HTTP 请求之间保持程序的状态。你必须要确定 ViewS把它添加到待发送数据:string vs = dDwtMTQwNDA4NDA4ODs7PuWdy3VjanmrKIqoo7kBHkDzjH2p; vs = HttpUtility.UrlEncode(vs);e 的值并且data += & VIEWSE= + vs;e 的值有可能包含一些 ASP.NET Web 难以处理的特殊字符(比如“&”),我因为 ViewS们应该针对 ViewSe 的值使用 HttpUtility.UrlEncode() 方

43、法来处理这种情况。 HttpUtility 类位于 System.Web 命名空间里,这个命名空间在默认情况下对于控制台程序来说是不可的,所以你必须要添加一个到 System.Web.dll(详细信息请参见 5.7 节)的工程引用。提醒一下,VIEWSE 前面有两个下划线。有两种方法可以确定 ViewSe 的初始值。第这里用到的)是通过手动运行 IE(或其他客户端程序),加载 WebForm.aspx一种(也就是程序,然后选择 View Source。第二种方法是通过程序来发送一个 HTTP 请求给 WebForm.aspx,然后再通过程序从返回的 HTTP 响应中取出 ViewSe 的值。这

44、种技术将在 5.8 节进行讲解。并没有完整的文档告诉,具体有哪些 ASP.NET 程序中的组件参与 ViewSe 的编码以及 ASP.NET Web 服务器是如何计算 ViewSe 的值的,所以说需要通过试验和纠错来确定可以去掉待发送字符串中的到底应该在待发送字符串里放上哪些值。比如说,在本例中,“TextBox2=empty”, 但是“Button1=clicked”是必需的。关于字符串“empty”和“clicked”并没ViewS严格的规定。换句话说,也可以写成“Button1=foo”,甚至是“Button1=”,而e 的值仍然会保持同步,并且自动化测试程序还是能够照常运行。使用象“e

45、mpty”和5.6 发送HTTPT 请求给ASP.NET Web 应用程序149“clicked”这样的字符串常量,可以让代码更具可读性,但也有可能会误导代码的复查者以为这些值特殊的含义。当添加 ViewSe 到待发送字符串时,ViewSe 值的位置并不是固定死的。但是,把 ViewSe 的值加在待发送字符串的最后可以让代码更具可读性。在 ASP.NET2.0 里,新加入了一个 EventValidation 特性用来防止回送性的信息。程序框架发送的是加密后的数据,这些数据作为 EVENTVALIDATION 隐藏字段的一部分。这个隐藏字段作为 Web 页面表单(form)的最后一个元素。所以

46、在 ASP.NET 2.0 环境下,必须像下面这样把 EventValidation 值添加到T 数据中:string ev = d+waMTswVDA4NDA4OQs7buWdy3VwbjkrKIqoo7kBHkDzjH2p; ev = HttpUtility.UrlEncode(ev);data += & EVENTVALIDATION= + ev;构建好这个用于T 的数据字符串之后,必须通过System.Text.Encoding.ASCII.GetBytes()方法把它转换成一个字节数组,因为 HTTP 数据是以字节的形式进行传输的。接下来,必须把request 对象的 Method

47、属性设为“T”,把 ContentType 属性设为“application/x-www-form-urlencoded”。ContentType 是一个字符串类型的值,它告诉 Web 服务器与这个 HTTP 请求相关的数据应该被解释为 HTML 表单数据。然后,需要把 ContentLength 属性设为字节数组中待发送数据的长度。准备好这个请求之后,可以通过 HttpWebRequest.GetRequestStream()方法获得这个请求的数据流,然后把待发送数据添加到这个 HTTP request 对象的数据流。reqst.Write(buffer, 0, buffer.Length)

48、;需要指定把哪个字节数组写到数据流,以及把字节数组的第几个元素作为起始位置和要写入的字节数。做完这些准备工作之后,接下来就可以发送 HTTP 请求并取回 HTTP 响应: HttpWebResponse res = (HttpWebResponse)req.GetResponse();Stream resst = res.GetResponseStream();然后可以使用一个 StreamReader 对象取回响应。这里讲述的技术对于检查由 ASP.NETWeb 应用程序发回的 HTTP 响应是很有用的,但是要把这种方案扩展为实用的自动化测试程序,则必须根据给定的期望值在返回的响应中进行查找

49、。如果需要处理有可以了:服务器的情况,只要为 HttpWebRequest 对象添加可选的 Proxy 属性就/ 此处初始化 HttpWebRequeststring proxy = someProxyMachineNameOrIPAddress; req.Proxy = new WebProxy(proxy, true);把服务器的机器名或者 IP 地址作为字符串传给 WebProxy 的构造函数,并且把生成的WebProxy 对象赋给 HttpWebRequest 对象。第二个参数是型变量,它指定本地地址是否忽略服务器设置;如果设为 true,则本地地址忽略通过把本节的代码重构为如下的一个

50、辅助方法,程度:服务器设置。可以大大提高自动化测试程序的模块化第 5 章 请求-响应测试150private sic bool ResponseHas(string uri, stringtData,string)/ 创建 HttpWebRequest/ 把tData 添加到请求数据流/ 获得 HttpResponse 数据流/ 把响应连接到 StreamReader 对象 sr string result = sr.ReadToEnd();if (result.IndexOf( return true;elsereturn false;) = 0)这个辅助方法有三个参数,依次是:指向 Web

51、 程序的 URL(比如“ WebForm.aspx”),待发送的数据(比如“TextBox1=red&TextBox2=blue”),以及一个目标字符串(比如“The result is purple”)。如果与发送的 HTTP 请求对应的 HTTP 响应包含目标字符串,则这个方法返回 true,如果目标字符串不在返回的 HTTP 响应里,则返回 false。5.12 节的示例程序包含 ResponseHas()的完整实现。5.7处理特殊的输入字符问题如何处理 HTTPT 数据中的特殊字符,比如“&”等。设计通过 HttpUtility.UrlEncode()方法把有可能带来问题的特殊字符转换

52、成与之对等的字符实体(character-entity)。方案string badValueForTextBox1 = this&t;string goodValueForTextBox1 =HttpUtility.UrlEncode(badValueForTextBox1);string data = TextBox1= + goodValueForTextBox1;注解如果把特殊字符(比如空格符)或者标点符号(比如“&”)放到 HTTP 请求数据流当中,接受这个请求的 ASP.NET Web 服务器有可能错误地解释这些字符。URL 的编码机制会把那些不允许出现在 URL 中的字符转换成与之

53、对等的字符实体。例如,当把“”嵌入一个作为 URL 进行传输的字符串时,会把它们分别编码为“3c”和“3d”。5.7 处理特殊的输入字符151成一个“%”开头的由三HttpUtility.UrlEncode()方法把有可能带来问题的特殊字符个字符组成的序列。UrlEncode()方法位于 System.Web 命名空间里。假设你的 ASP.NET Web程序包含以下代码:if (TextBox1.Text = this& TextBox2.Text = Oh really;elset)TextBox2.Text = unknown input;为了测试上述代码逻辑上是否正确,你需要把字符串“t

54、his&t”发送到 Web 程序。如果试图直接使用string data = TextBox1=this&t;那么得到的HTTP 响应将是 TextBox2 的attribute 为“unknown input”,而不是“Oh really”,T 数据的“&”符号会让 Web 服务器觉得很困惑。为了解决这个问题,可以通过因为嵌入HttpUtility.UrlEncode()方法把“&”字符转换成“%26”。当 Web 服务器收到 HTTP 请求时,URL 中的%26 会被成“&”,进而你的自动化测试程序就会顺利执行。可以采取的一种策略是,总是针对输入的当它不包含特殊字符的时候也不例外:T 数据

55、应用 HttpUtility.UrlEncode(),即使string anyValue = whatever;anyValue = HttpUtility.UrlEncode(anyValue); string data = TextBox1= + anyValue;这种策略也有它不好的方面,有时候如果你真的想要在测试过程中发送一些特殊字符,那就t 数据的 value 部分应用法是从一个外部测试用例不该采取这种策略。法是创建两个套件:一个套件总是针对UrlEncode()方法,另一个套件从来不使用 UrlEncode()。另外文件中读入输入的T 数据和期望值,以及用来表示是否要进行 URL

56、编码的一个变量,这个变量作为测试套件的一个参数:001!TextBox1!red!noencode!Roses are red002!TextBox1!this& 003!TextBox1!this&t!encode!Oh really t!noencode!unknown input然后就可以添加逻辑处理分支来决定是否应该进行 URL 编码:while (line = sr.ReadLine() != null) / 测试循环tokens = line.Split(!);if (tokens3 = encode)input = HttpUtility.UrlEncode(tokens2);

57、elseinput = tokens2;data = tokens1 + = + input;/ etc.第 5 章 请求-响应测试1525.8通过编写程序确定 ViewSate 和 EventValidation 的值问题如何通过编写程序确定 ASP.NET Web 程序中 ViewSate 的初始值(以及 ASP.NET 2.0 中EventValidation 的初始值)。设计使用 WebCnt 对象发送一个简单的、试探性的 HTTP 请求给待测程序。取回 HTTP 响应然后通过 String.IndexOf()和 String.SubString()方法出 ViewSate 值(以及

58、ASP.NET2.0 中的 EventValidaton 值)。方案如果是在 ASP.NET 1.1 环境下运行:string uri = ;WebCnt wc = new WebCnt();Stream st = wc.OpenRead(uri);StreamReader sr = new StreamReader(st); string res = sr.ReadToEnd(); sr.Close();st.Close();start = res.IndexOf( VIEWSE, 0)+ 20;end = res.IndexOf(, start);string vs = rebstring

59、(start, (end-start);Console.Wriine(ViewSe = + vs);如果是在 ASP.NET 2.0 环境下运行:string uri = ;WebCnt wc = new WebCnt();Stream st = wc.OpenRead(uri);StreamReader sr = new StreamReader(st); string res = sr.ReadToEnd(); sr.Close();st.Close();startVS = res.IndexOf( VIEWSE, 0) + 37;5.8 通过编写程序确定 ViewSate 和 Event

60、Validation 的值153endVS = string vs = Console.WristartEV endEV = string ev = Console.Wrires.IndexOf(, startVS);rebstring(startVS, (endVS-startVS);ine(ViewSe = + vs);= res.IndexOf( EVENTVALIDATION, 0) + 49;res.IndexOf(, startEV);rebstring(startEV, (endEV-startEV); ine(EventValidation = + ev);注解在通过程序发送

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论