我的漫漫程序之旅

专注于JavaWeb开发
随笔 - 39, 文章 - 310, 评论 - 411, 引用 - 0
数据加载中……

基于SOAP报文的纯服务端测试

AbstractXFireTest扩展于JUnit标准的TestCase类,提供了向某个Web Service发送SOAP请求报文并对返回的SOAP响应报文进行检验的能力。该测试类提供了若干个方便的断言方法,分别介绍如下:

—  void assertNoFault(Document node):确认SOAP响应报文无错误;

—  java.util.List assertValid(java.lang.String xpath, java.lang.Object node):确认在DOM节点特定路径下有对应的元素,路径通过XPath表达式进行定义,该方法还将匹配的元素以List对象返回,用户可以对匹配的元素进行进一步检验;

—  void assertXPathEquals(java.lang.String xpath, java.lang.String value, Document node):确认特定路径DOM节点为某一特定值;

—  assertInvalid(java.lang.String xpath, java.lang.Object node):确认DOM节点特定路径下未包含元素。

AbstractXFireSpringTest是AbstractXFireTest的子类,在Spring中用户只需要扩展该类并实现该类的抽象方法ApplicationContext createContext(),就可以对Spring容器中用XFire定义的Web Service进行测试了。

为了测试Web Service,我们必须准备一个SOAP请求报文,用户可以简单地手工编写一个,或通过SOAP报文截取工具(如前面我们介绍的TcpTrace、SOAPScope、Apache Axis的TCPMon等)获得一些可用的SOAP请求报文。代码清单16-6是一个访问BbtForumService 服务的请求SOAP报文:

代码清单16-6  request_soap.xml:SOAP报文层面测试

 

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"

    xmlns:xsd
="http://www.w3.org/2001/XMLSchema"

    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance">

    
<soap:Body>

        
<getRefinedTopicCount

            
xmlns="http://server.xfire.baobaotao.com">

            
<in0 xmlns="http://server.xfire.baobaotao.com">20</in0>

        
</getRefinedTopicCount>

    
</soap:Body>

</soap:Envelope>

 

我们将其保存在request_soap.xml文件中,放置在类路径com/baobaotao/xfire/server下。当该SOAP请求报文发送给BbtForumService的Web Service后,我们预计它应该返回如代码清单16-7所示的正确的SOAP响应报文:

代码清单16-7  SOAP响应报文

 

<?xml version="1.0" encoding="UTF-8"?>

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  
<soap:Body>

    
<getRefinedTopicCountResponse xmlns="http://www.baobaotao.com">

      
<out>32</out>

    
</getRefinedTopicCountResponse>

  
</soap:Body>

</soap:Envelope>

 

下面,我们着手编写测试BbtForumService Web Service的测试类,以验证实际SOAP响应报文是否和代码清单16-7中的一样:

代码清单16-8  TestBbtForumService

使用AbstractXFireSpringTest测试Web Service首先要做的第一件事是通过实现createContext()方法构造Spring容器,如①所示。当Spring容器启动时,XFire将自动让容器中的Web Service生效(仅进行测试,不能对外提供服务)。

第二步需要向Web Service发送一个SOAP请求报文以得到一个SOAP响应报文,如②所示。接下来,通过AbstractXFireTest提供的检测DOM内容的方法对报文进行正确性验证。由于代码清单16‑7的SOAP报文体中对应的<getRefinedTopicCountResponse>元素及内部元素都位于http://www.baobaotao.com命名空间中,报文体中没有为这个命名空间定义相应的别名,为了在后续断言方法中能够使用简单的方式定义XPath表达式,我们在④处为http://www.baobaotao.com命名空间定义了一个别名。

理解以上测试代码中几个断言方法的关键在于理解XPath表达式语言,XPath语法内容很丰富,不可能在这里逐一讲解,我们只介绍一些典型的XPath语法以满足常见的测试需求:

— 以“/”为前缀的路径表示从DOM根路径开始,如“/soap:Envelope/soap:Body”;

— 以“//”为前缀的路径表示从DOM任意元素开始查询,如“//out”表示任意元素为out的元素;

— 元素的属性通过@attrName表示,如“//xsd:complexType[@name=""Book""]”表示DOM中任意元素名为complexType并且拥有一个值为Book的name属性的元素;

— 元素的值通过text()表示,如“//test:Response[text()='32']”表示DOM中任意值为32、元素名为Response,且位于test命名空间中的元素。

现在回过头来看⑤、⑥两处的断言方法,相信大家就可以很容易地理解断言规则了,⑤处的断言检测SOAP响应报文是否包含某一特定元素,而⑥处的断言则对元素内的值进行检测。我们也可以通过printNode()方法将一个节点输出到控制台上,以便于查看。

16.5.2  在JVM模式通过客户端进行测试

能够不启动Web服务器的情况下通过客户端程序测试Web Service的功能,这一崭新的测试方法对于开发人员来说一定颇具吸引力。因为,这意味着用户可以完全在IDE环境中运行测试,不需要外部环境的支持。不过享受这一测试好处的应用必须保证客户端和服务端的Web Service都位于同一JVM中,这时请求报文和响应报文直接在JVM内部通道中传输。当使用JVM内部通道传输请求和响应的SOAP报文时,我们只需要调整服务的地址就可以了:

代码清单16-9  TextBbtForumService  JVM模式测试

 

以上代码中,①处的服务地址采用了JVM模式的地址,和其对应的HTTP地址则是http://localhost:8080/baobaotao/service/BbtForumService,所以只需要将服务名前的部分替换为“xfire.local://”就可以了。



posted on 2008-05-15 15:57 々上善若水々 阅读(4801) 评论(0)  编辑  收藏 所属分类: WebService


只有注册用户登录后才能发表评论。


网站导航: