我的漫漫程序之旅

          專注于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 々上善若水々 閱讀(4857) 評論(0)  編輯  收藏 所屬分類: WebService

          主站蜘蛛池模板: 方山县| 吉木萨尔县| 故城县| 博兴县| 河西区| 维西| 龙州县| 靖江市| 莆田市| 巴中市| 苏州市| 哈密市| 克东县| 镇宁| 新余市| 洛扎县| 肃宁县| 光山县| 中山市| 清新县| 永宁县| 报价| 鱼台县| 安多县| 抚宁县| 上犹县| 绥棱县| 金塔县| 锡林郭勒盟| 岱山县| 高平市| 四子王旗| 定远县| 平遥县| 楚雄市| 突泉县| 汾阳市| 肥西县| 黔西县| 舞阳县| 合作市|