8.3 使用HTTP测试Web方法
问题
如何使用HTTP通过调用Web service的Web方法对其进行测试。
设计
创建一个指向待测Web方法的HTTPWebRequest对象,使用GetResponse()方法发送对应于“形参-实参(parameter-argument)”的“名称-值”序列,然后通过GetResponseStream()方法取回响应。
方案
这个例子发送字符串“testing”到Web方法GetTitles():
Console.WriteLine("Calling Web Method GetTitles() using HTTP");
string input = "testing";
string postData = "filter=" + input;
byte[] buffer = Encoding.ASCII.GetBytes(postData);
string uri =
"http://localhost/TestAuto/Ch8/TheWebService/BookSearch.asmx/GetTitles";
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(uri);
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = buffer.Length;
req.Headers.Add("SOAPAction: \"http://tempuri.org/GetTitles\"");
req.Timeout = 5000;
Stream reqst = req.GetRequestStream(); // 向request流中加入表单数据
reqst.Write(buffer, 0, buffer.Length);
reqst.Flush();
reqst.Close();
HttpWebResponse res = (HttpWebResponse)req.GetResponse();
Stream resst = res.GetResponseStream();
StreamReader sr = new StreamReader(resst);
string response = sr.ReadToEnd();
Console.WriteLine("HTTP response is " + response);
Console.WriteLine("\nDetermining pass/fail");
if ( response.IndexOf("002") >= 0 &&
response.IndexOf("004") >= 0 &&
response.IndexOf("005") >= 0 )
Console.WriteLine("\nPass");
else
Console.WriteLine("\nFail");
sr.Close();
resst.Close();
因为ASP.NET Web service是基于HTTP协议的,所以可以使用HttpWebRequest类直接向Web方法发送数据。Web方法期望值的数据格式是“名称-值”组成的序列,例如:
filter=testing
在这里,名称部分就是Web方法的参数名称,值部分就是参数的取值。HttpWebRequest.GetResponse()方法返回一个HttpWebResponse对象,这个对象有一个GetResponseStream()方法可以用来以字符串的形式读取响应数据。
注解
用于测试ASP.NET Web service的4种主要方法中,使用HTTP这种方式,其所进行的操作在中间的抽象层次上。这种技术在简单性和灵活性之间提供了很好的折中。与8.2节所描述的如何生成一个SOAP请求模板类似,我们也可以通过让Visual Studio运行Web service生成一个HTTP请求模板。
根据Web service所在的服务器上的特定配置,可能需要(也可能不需要)添加特殊的SOAPAction报头:
req.Headers.Add("SOAPAction: \"http://tempuri.org/GetTitles\"");
从实践上来看,简单的做法是一开始就试着给请求加上报头,因为服务器通常会忽略掉不能识别的报头。用于发送HTTP数据的模式是相当简单的:首先创建一个“名称-值”所组成的字符串,它对应于Web方法的“形参-实参”,然后把要发送的字符串转换成字节数组。接下来,通过WebRequest.Create()方法所提供的工厂机制(而不采用new关键字进行实例化)创建一个HttpWebRequest对象,然后为Method、ContentType和ContentLength属性指定属性值。再接下来,通过把POST数据写入Stream对象发送HTTP请求(这里并不需要显式地使用类似于Write()的方法),然后通过一个StreamReader对象取回响应。通过研究像上述方案所提供的具体例子(而不是那些泛泛的原理)可以更好地理解这个过程。
正如8.2节所讨论的那样,判断受测Web方法通过与否比调用它要更为困难。一种好的策略是,尽可能地组织好后台数据库的测试数据,从而让这些数据更容易被确定并且被唯一确定。但这种方法并不总是可行的,这时候,必须依赖于手工测试作为自动化测试的补充。使用HTTP调用Web方法的关键是,通过程序向Web服务器发送数据;其他与此相关的技术请参见第5章。







