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è)試
我們將其保存在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)文
下面,我們著手編寫(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)上,以便于查看。
能夠不啟動(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
Powered by: BlogJava Copyright © 々上善若水々