(本文摘自互联网单元测试及实践)
在上一节中我们介绍了测试客户端调用的方法,本章节主要讲述在.net环境下客户端调用的方法,我们将着重介绍如何生成客户端代理,如何实现WSS客户端配置。
8.6.1 接口代理类的生成
在.net下对WebService的接口调用,很重要一点需要将Soap协议进行消息编码,使之成为net下可以调用的客户端。客户端的代理类必须从 SoapHttpClientProtocol 类派生,本文提供两种方式来是实现代理类的快速编写,供读者参照。
在本章节中首先介绍如何使用VS2005自带的WebRefrence方法来生成代理类的方法。
下面就以http://10.0.4.138:1688/webservice/AppConsumeService?wsdl
提供的服务为例。讲解一下在VS2005下如何生成代理类,并且像调用本地方法一样调用WebService的接口。
步骤一、在VS2005中新建工程TestHello,具体过程不在这里详述。
步骤二、在工程中Refrence右击,点击添加Web引用(Add Web Refrence),如图8.5。
图8.5
步骤三、在添加Web引用的窗体中的Url编辑框输入Wsdl的地址,并点击go,编辑器自动会获取Wsdl中的Soap协议内容。在Web refrence name的编辑框中可以编辑引用名称(如图8.6)。在本例中输入APPTEST。
图 8.6
步骤四,点击add reference之后,系统自动生成代理类文件。点击VS2005编辑器菜单->project->Show all files,在工程目录下可以看见一个APPTEST的文件包,打开包文件下面有个refrence.map->refrence.cs。下面对其中代码要点进行讲解。
代码8.14
public partial class AppConsumeService: System.Web.Services.Protocols. SoapHttpClientProtocol { //实现代码 }
|
由片段一的代码可以知道代理类是从SoapHttpClientProtocol派生的,但是如果想对消息头添加更多的信息,如签名信息,那么微软提供了Microsoft.Web.Services2.WebServicesClientProtocol的类可以使用,详细在8.6.2节进行描述。
代码8.15
01 [System.Web.Services.Protocols.SoapDocumentMethodAttribute("urn:checkBalance", 02 RequestNamespace="http://account.api.core.aep.alisoft.com", 03 ResponseNamespace="http://account.api.core.aep.alisoft.com", 04 Use=System.Web.Services.Description.SoapBindingUse.Literal, 05 ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] 06 [return: System.Xml.Serialization.XmlElementAttribute("return", IsNullable=true)] 07 public string checkBalance([System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] string param0, 08 [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] string param1, 09 double param2, 10 [System.Xml.Serialization.XmlIgnoreAttribute()] bool param2Specified) { 11 object[] results = this.Invoke("checkBalance", new object[] { 12 param0, 13 param1, 14 param2, 15 param2Specified}); 16 return ((string)(results[0])); 17 } |
在代码8.15中读者容易发现,由VS2005自动生成的代理类,已经根据webservice发布的wsdl文件,将其中的方法进行了映射,如例子中提到的checkbalance的方法。同时在代码1-6行,明确指出解析该段代码和wsdl之间的映射关系,包括它所属的命名空间等信息。
使用VS2005来自动生成客户端,是编写客户端测试代码比较理想的方法。但是,如果你想直接编辑客户端发送的SOAP请求消息并查看接收到的响应消息时,在VS.NET里的实现就比较麻烦了,Microsoft发布了.NET WebService Studio(WSS),它是用来对Web services进行交互性测试的一个万能的工具。本文将主要介绍使用WSS生成代理类和做些简单的测试。
Ø 使用WSS直接进行相关方法测试。
打开WSS(如图8.7),在编辑框WSDL ENDPOINT中输入相应的WSDL地址,还是以http://10.0.4.138:1688/webservice/AppConsumeService?wsdl为例,输入该地址,点击get。可以看到在Invoke的树形边框中将罗列出相应的服务中包含的方法。接着试试点击其中的方法,如checkbalance,设置相应的参数值,点击invoke可以在output中看到调用该服务得到的结果信息(如图8.7)。
图8.7
Ø 直接编辑Soap消息,进行简单测试。
在做完前面的步骤之后,点击request/Response菜单将看到,实际上在消息层面发生的Soap消息内容。如图8.8,可以编辑红色边框中的内容,点击Send键实现直接在消息层面的测试。
图8.8
Ø 利用该工具直接生成代理类
同时也可以使用WSS工具生成相应的.net代码的代理类。只要点击WSDLS&Proxy菜单。在左侧的树形编辑框中点击Proxy就可以看见相应的代理类的C#代码,读者只要拷贝的自己的工程中既可以使用。
8.6.2 有WS-Security的客户端调用
本章节将介绍一下如何用.net做为客户端调用带有数字签名验证的服务器端方法。对服务器端要求进行签名验证的方法测试,需要在调用服务器端方法之前,对消息头的信息装载签名私钥的信息。为此,本章将介绍如何制作可以在.net下使用的证书;如何在.net下应用证书进行签名;编写测试用例。
n 如何制作证书
制作证书有很多方法,本文介绍的方法是如何将jks文件中信息导入到Windows环境的证书管理器中便于.net的调用。
步骤一、按8.5.2章节中的代码8.13 keygen.bat生成0001.jks。
步骤二、使用工具JKS2PFX.bat将0001.jks转换成可以导入Windows证书管理器的pfx文件。执行代码片段如:代码8.16,得到0001.pfx。
代码8.16
1 jks2pfx 0001.jks 123456 123456 0001
步骤三、将证书导入到Windows证书管理器中。在cmd中输入mmc打开Windows控制台,点击添加/删除管理单元-证书。得到如图8.9节目,点击证书(当前用户)->个人->证书。右键点击导入证书,将证书导入到个人证书文件管理组下。
图 8.9
步骤四、将个人证书下的别名是mike的证书(即步骤三导入的证书),剪切到受信任的根证书颁发机构目录下,使证书授信。
步骤五、将授信过的证书拷贝回个人->证书文件夹。
步骤六、重复步骤一至步骤五的做法,将服务器端公钥引入到证书管理器。
n 在.net下如何使用证书
本文将介绍如何使用Microsoft WSE2.0完成对WS-Security签名的装载。在使用这种方法之前首先要安装Micorsoft WSE2.0的工具,工具存放路径CD:kkkkk。本例中将新建一个工程TestWSE,并在上面逐步完成WSE配置以及代码中关于配置部分的编写。
步骤一、在工程中添加Web引用,详细步骤如8.6.1中介绍。在添加完Web引用之后,在工程中会增加一个app.config文件。
步骤二、打开程序列表中WSE2.0->Configuration Editor(如图8.10),点击file->open打开在步骤一中新增的app.config文件。勾选Enable this project for Web Services Enhancements。点击Policy,勾选Enable Policy;点击Add,在弹出窗体上点击OK,进入Security配置向导,点击Next;选择Secure a client application点击Next;在消息设置框选择对Request和Response的消息进行签名设置,点击Next;点击Select Certificate,选择相应的证书Mike;在Trusted Server Certificates窗体中,点击Add,选择包含服务器端公钥的证书。点击Save,配置WSE代理文件完成。
步骤三、刷新工程,点击Show All Files会发现新增了一个文件PolicyCache.config,把该文件添加到工程中。在Reference中添加Microsoft.Web.Services2的引用,修改Reference.cs文件中代码,将代理类的基类由原先的System.Web.Services.Protocols.SoapHttpClientProtocol改成Microsoft.Web.Services2.WebServicesClientProtocol。
步骤四、读者可以根据自己的实际情况编辑PolicyCache.config文件。如果只需要对发送的消息进行签名,那么只需要Request的代理如<request policy="#Sign-X.509-5" />,那么读者可以删除关于response policy相关的信息。同时也可以根据实际情况修改wssp:MessageParts决定对消息的哪些部分进行签名,这个需要设置和服务器相匹配的配置。本文只关心对客户端发送的消息进行签名,所以对删除response policy的相关内容。
完成前面四个步骤的设置,就完成了对.net下WS-Security的配置。下面介绍一下如何编写测试代码进行测试。
n 如何编写测试代码
本小节主要介绍如何使用NUnit框架编写调用带有WS-Security测试用例。本文将在TestWSE工程的基础上进行代码编写。
首先,在工程中引入NUnit Framework组件。右键点击Add Reference,选择nunit.framework,点击OK。
在文件头中,添加代码using NUnit.Framework,在类的声明前添加[TestFixture],同时在编写每个测试用例代码时方法前面添加[Test],示例代码如代码片段8.17
代码8.17
01 using System; 02 using System.Collections.Generic; 03 using System.Text; 04 using NUnit.Framework; 05 namespace TestWSE 06 { 07 [TestFixture] 08 class TestHello 09 { 10 [Test] 11 public void TestCheckBalance() 12 { 13 Test.APPTEST.AppConsumeService ws = new Test.APPTEST.AppConsumeService(); 14 String result = ws.checkBalance("2", "2", 10.2, true); 15 Assert.AreEqual("-3",result); 16 } 17 } 18 } |
04行:添加NUnit.Framework引用
13行:新建代理类的实例
14行:调用待测试的服务器端代码
15行:对调用的结果进行断言