我的漫漫程序之旅

          專(zhuān)注于JavaWeb開(kāi)發(fā)
          隨筆 - 39, 文章 - 310, 評(píng)論 - 411, 引用 - 0

          導(dǎo)航

          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿(39)

          隨筆檔案(43)

          文章分類(lèi)(304)

          文章檔案(257)

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          基于SOAP報(bào)文的純服務(wù)端測(cè)試

          AbstractXFireTest擴(kuò)展于JUnit標(biāo)準(zhǔn)的TestCase類(lèi),提供了向某個(gè)Web Service發(fā)送SOAP請(qǐng)求報(bào)文并對(duì)返回的SOAP響應(yīng)報(bào)文進(jìn)行檢驗(yàn)的能力。該測(cè)試類(lèi)提供了若干個(gè)方便的斷言方法,分別介紹如下:

          —  void assertNoFault(Document node):確認(rèn)SOAP響應(yīng)報(bào)文無(wú)錯(cuò)誤;

          —  java.util.List assertValid(java.lang.String xpath, java.lang.Object node):確認(rèn)在DOM節(jié)點(diǎn)特定路徑下有對(duì)應(yīng)的元素,路徑通過(guò)XPath表達(dá)式進(jìn)行定義,該方法還將匹配的元素以List對(duì)象返回,用戶(hù)可以對(duì)匹配的元素進(jìn)行進(jìn)一步檢驗(yàn);

          —  void assertXPathEquals(java.lang.String xpath, java.lang.String value, Document node):確認(rèn)特定路徑DOM節(jié)點(diǎn)為某一特定值;

          —  assertInvalid(java.lang.String xpath, java.lang.Object node):確認(rèn)DOM節(jié)點(diǎn)特定路徑下未包含元素。

          AbstractXFireSpringTest是AbstractXFireTest的子類(lèi),在Spring中用戶(hù)只需要擴(kuò)展該類(lèi)并實(shí)現(xiàn)該類(lèi)的抽象方法ApplicationContext createContext(),就可以對(duì)Spring容器中用XFire定義的Web Service進(jìn)行測(cè)試了。

          為了測(cè)試Web Service,我們必須準(zhǔn)備一個(gè)SOAP請(qǐng)求報(bào)文,用戶(hù)可以簡(jiǎn)單地手工編寫(xiě)一個(gè),或通過(guò)SOAP報(bào)文截取工具(如前面我們介紹的TcpTrace、SOAPScope、Apache Axis的TCPMon等)獲得一些可用的SOAP請(qǐng)求報(bào)文。代碼清單16-6是一個(gè)訪問(wèn)BbtForumService 服務(wù)的請(qǐng)求SOAP報(bào)文:

          代碼清單16-6  request_soap.xml:SOAP報(bào)文層面測(cè)試

           

          <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文件中,放置在類(lèi)路徑com/baobaotao/xfire/server下。當(dāng)該SOAP請(qǐng)求報(bào)文發(fā)送給BbtForumService的Web Service后,我們預(yù)計(jì)它應(yīng)該返回如代碼清單16-7所示的正確的SOAP響應(yīng)報(bào)文:

          代碼清單16-7  SOAP響應(yīng)報(bào)文

           

          <?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>

           

          下面,我們著手編寫(xiě)測(cè)試BbtForumService Web Service的測(cè)試類(lèi),以驗(yàn)證實(shí)際SOAP響應(yīng)報(bào)文是否和代碼清單16-7中的一樣:

          代碼清單16-8  TestBbtForumService

          使用AbstractXFireSpringTest測(cè)試Web Service首先要做的第一件事是通過(guò)實(shí)現(xiàn)createContext()方法構(gòu)造Spring容器,如①所示。當(dāng)Spring容器啟動(dòng)時(shí),XFire將自動(dòng)讓容器中的Web Service生效(僅進(jìn)行測(cè)試,不能對(duì)外提供服務(wù))。

          第二步需要向Web Service發(fā)送一個(gè)SOAP請(qǐng)求報(bào)文以得到一個(gè)SOAP響應(yīng)報(bào)文,如②所示。接下來(lái),通過(guò)AbstractXFireTest提供的檢測(cè)DOM內(nèi)容的方法對(duì)報(bào)文進(jìn)行正確性驗(yàn)證。由于代碼清單16?7的SOAP報(bào)文體中對(duì)應(yīng)的<getRefinedTopicCountResponse>元素及內(nèi)部元素都位于http://www.baobaotao.com命名空間中,報(bào)文體中沒(méi)有為這個(gè)命名空間定義相應(yīng)的別名,為了在后續(xù)斷言方法中能夠使用簡(jiǎn)單的方式定義XPath表達(dá)式,我們?cè)冖芴帪閔ttp://www.baobaotao.com命名空間定義了一個(gè)別名。

          理解以上測(cè)試代碼中幾個(gè)斷言方法的關(guān)鍵在于理解XPath表達(dá)式語(yǔ)言,XPath語(yǔ)法內(nèi)容很豐富,不可能在這里逐一講解,我們只介紹一些典型的XPath語(yǔ)法以滿(mǎn)足常見(jiàn)的測(cè)試需求:

          — 以“/”為前綴的路徑表示從DOM根路徑開(kāi)始,如“/soap:Envelope/soap:Body”;

          — 以“//”為前綴的路徑表示從DOM任意元素開(kāi)始查詢(xún),如“//out”表示任意元素為out的元素;

          — 元素的屬性通過(guò)@attrName表示,如“//xsd:complexType[@name=""Book""]”表示DOM中任意元素名為complexType并且擁有一個(gè)值為Book的name屬性的元素;

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

          現(xiàn)在回過(guò)頭來(lái)看⑤、⑥兩處的斷言方法,相信大家就可以很容易地理解斷言規(guī)則了,⑤處的斷言檢測(cè)SOAP響應(yīng)報(bào)文是否包含某一特定元素,而⑥處的斷言則對(duì)元素內(nèi)的值進(jìn)行檢測(cè)。我們也可以通過(guò)printNode()方法將一個(gè)節(jié)點(diǎn)輸出到控制臺(tái)上,以便于查看。

          16.5.2  在JVM模式通過(guò)客戶(hù)端進(jìn)行測(cè)試

          能夠不啟動(dòng)Web服務(wù)器的情況下通過(guò)客戶(hù)端程序測(cè)試Web Service的功能,這一嶄新的測(cè)試方法對(duì)于開(kāi)發(fā)人員來(lái)說(shuō)一定頗具吸引力。因?yàn)?,這意味著用戶(hù)可以完全在IDE環(huán)境中運(yùn)行測(cè)試,不需要外部環(huán)境的支持。不過(guò)享受這一測(cè)試好處的應(yīng)用必須保證客戶(hù)端和服務(wù)端的Web Service都位于同一JVM中,這時(shí)請(qǐng)求報(bào)文和響應(yīng)報(bào)文直接在JVM內(nèi)部通道中傳輸。當(dāng)使用JVM內(nèi)部通道傳輸請(qǐng)求和響應(yīng)的SOAP報(bào)文時(shí),我們只需要調(diào)整服務(wù)的地址就可以了:

          代碼清單16-9  TextBbtForumService  JVM模式測(cè)試

           

          以上代碼中,①處的服務(wù)地址采用了JVM模式的地址,和其對(duì)應(yīng)的HTTP地址則是http://localhost:8080/baobaotao/service/BbtForumService,所以只需要將服務(wù)名前的部分替換為“xfire.local://”就可以了。



          posted on 2008-05-15 15:57 々上善若水々 閱讀(4856) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): WebService

          主站蜘蛛池模板: 兴化市| 响水县| 神木县| 鹿泉市| 澄城县| 霸州市| 张家港市| 青海省| 东阳市| 房产| 瑞安市| 花莲市| 嘉兴市| 安吉县| 景洪市| 海门市| 武威市| 敦化市| 周宁县| 陇川县| 蓬溪县| 濉溪县| 赤壁市| 淄博市| 永和县| 阳原县| 呼玛县| 萨嘎县| 鄄城县| 乐亭县| 莒南县| 共和县| 潍坊市| 曲麻莱县| 黄山市| 凭祥市| 开江县| 镇巴县| 苏州市| 通河县| 齐齐哈尔市|