8.1 使用Proxy机制测试Web方法
问题
如何使用proxy机制通过调用某个Web方法来对其进行测试。
设计
通过Visual Studio .NET向你的自动化测试套件添加一个指向待测Web Service的Web引用。这么做可以为这个Web Service创建一个proxy,从而使这个Web Service看起来像是一个本地类。然后你可以实例化一个代表这个Web service的对象,并且调用属于这个Web service的Web方法。
方案
try
{
string input = "the";
int expectedCount = 1;
TheWebReference.BookSearch bs = new TheWebReference.BookSearch();
DataSet ds = new DataSet();
Console.WriteLine("Calling Web Method GetTitles() with 'the'");
ds = bs.GetTitles(input);
if (ds == null)
Console.WriteLine("Web Method GetTitles() returned null");
else
{
int actualCount = ds.Tables["Table"].Rows.Count;
Console.WriteLine("Web Method GetTitles() returned " + actualCount + " rows");
if (actualCount == expectedCount)
Console.WriteLine("Pass");
else
Console.WriteLine("*FAIL*");
}
Console.WriteLine("Done");
Console.ReadLine();
}
catch(Exception ex)
{
Console.WriteLine("Fatal error: " + ex.Message);
Console.ReadLine();
}
这段代码能够运行的前提是已经存在一个名为BookSearch的Web service,这个Web service包含一个名为GetTitles()的Web方法。GetTitles()方法接受一个目标字符串作为输入参数并针对那些书名包含目标字符串的记录,返回一个包含书籍信息(ID、书名、价格)的DataSet对象。当Web引用添加到测试套件代码以后,这个引用的名字由默认的localhost改成了更为形象的TheWebReference。然后这个名称就可以作为一个命名空间来使用。Web service的名字,即BookSearch作为一个proxy,它会像一般的本地类一样被实例化,因此你可以像调用一个普通的实例化方法那样调用GetTitles()方法。请注意,GetTitles()方法是一个Web方法而不是常规方法这个事实对于调用它的程序来说几乎是透明的。
注解
在用于测试ASP.NET Web service的4种主要方法中(即proxy机制、HTTP、TCP和Sockets),使用Visual Studio所提供的proxy机制是最为简单的方法。你只需要像应用程序那样调用待测Web方法就可以了。这种情况可以与API测试做一下类比,进行API测试的时候测试套件就像应用程序那样调用API方法。使用proxy机制是调用Web service的最基本的方法,设计自动化测试程序的时候尽量不要漏掉它。
在本例中,确定GetTitles()方法的返回值是否正确,比调用这个方法还要困难。因为GetTitles()返回的是一个DataSet对象,其期望值也应该是一个DataSet对象。对于待测Web方法返回标量值(scalar value)的情况,比如说int值,判断其结果通过与否是较为简单的。例如,要测试GetTitles()方法:
Console.WriteLine("Testing CountTitles() via poxy mechanism");
TheWebReference.BookSearch bs = new TheWebReference.BookSearch();
string input = "testing";
int expected = 3;
int actual = bs.CountTitles(input);
if (actual == expected)
Console.WriteLine("Pass");
else
Console.WriteLine("*FAIL*");
在前面的方案中,调用GetTitles()之后,我们应该比较返回的DataSet对象中实际的行数与期望的行数。但这只是检查了行数,而并没有检查返回的数据是否正确。我们将在第11章介绍其他一些方法来处理诸如DataSet对象这样的复杂返回类型。







