天天看點

第一章 使用SOAPUI測試和開發Web Services Stubs

Stub(樁件)的作用是:如果一個接口有很多方法,如果要實作這個接口,就要實作所有的方法。但是一個類從業務來說,可能隻需要其中一兩個方法。如果直接去實作這個接口,除了實作所需的方法,還要實作其他所有的無關方法。而如果通過繼承存根類就實作接口,就免去了這種麻煩。對stub應答的設定是為了通過測試。 stubs隻檢查的是狀态(state)。

本章内容:

n  使用SoapUI工具生成一個WSDL優先的web 服務

n  在測試前,開發一個SOAP web服務

n  使用一個WSDL更新一個SOAP項目

n  使用WSDL 重構更新一個SOAP項目

n  測試前,生成并開發一個RESTful webservice stub(樁件)

n  使用REST discovery生成SoapUI測試

1.1  簡介

Web Service Stubs一般是在項目早期階段就被開發,Stubs目的是:當整個web服務被實作時,給客服端提供有限的功能。該章節将告訴,使用SoapUI怎麼幫助你快速測試和開發簡單的Java REST和SOAP web服務Stubs、以及如何通過錄制web服務的互動過程生成測試?使用JAVA編寫的Web Service Stub能使用Java成功執行。

除了對基本的SoapUI測試提供快速的熱身之外,服務接口和實作示例将在本書後面被重用作更進階主題的基礎。

在本章你能學到什麼,大緻的内容如下:

1.     怎麼使用SoapUI的WSDL幫助你測試、更新、重構、開發一個簡單的SOAP Web 服務的Stub。

2.     怎麼使用SoapUI幫助你測試、開發一個簡單的RESTWeb服務的Stub

3.     怎麼使用SoapUI的發現(discovery)功能生産測試

4.     使用Apache CXF生成、實作并運作基礎的JAX-RS和JAX-WS Web服務Stubs

在學習前,你需要部署環境,你需要如下軟體:

Ø  JDK:編譯運作代碼(1.6以上)

Ø  Apach CXF:用于建構、運作(有時),REST和SOAP Web服務

Ø  IDE(可選):使用一個IDE,例如Eclipse,能更容易的發現、編譯、執行執行個體代碼

本文開始,不包括SoapUI的安裝、啟動、SoapUI概述,直接從如何建立基礎的SoapUI REST和SOAP 項目、測試、斷言(assertion)開始。如果想從起步開始,可以看:http://www.soapui.org

1.2  使用SoapUI工具生成一個WSDL優先的Web服務

本部分将展示,怎麼把Apache CXF內建到SoapUI工具上生成一個可運作的空Java Web服務,該服務是使用它的WSDL實作的。這可能是有用,如果需要一個快速的菜單驅動方法去建立一個Soap Web服務,該Web服務能獨立被實作和部署到SoapUI上。

1.2.1準備開始

         該WSDL被用于定義一個簡單的invoice WEB 服務。它隻有一個函數(operation)去引用一個基本的invoice文檔,該操作的參數invoice數量:

l  Operation:getInvoice 

l  Request:invoiceNo : string

l Response:InvoiceDocument(invoiceNo : string, company : string, amount: string)

l  Location: http://localhost:9001/ws/invoice/v1

該WSDL可以在本章代碼塊中:soap/invoicev1/wsdl/invoice_v1.wsdl。在這之前需要把Apache CXFWeb服務架構內建到SoapUI工具生成Web服務Stub。下載下傳最新版本的下載下傳連結:​​http://cxf.apache.org/download.html​​(我使用3.2.1版本)。版本3.01需要JDK1.7。

1.2.2 建立步驟

         首先,配置SoapUI能夠生産并建構invoice的web服務。這時,作為一個标準的Java運作該服務。執行的步驟如下:

1.        啟動并打開SoapUI,選擇ToolsàApache CXF,點選右下角的Tools,進入SoapUI Preferences視窗:

第一章 使用SOAPUI測試和開發Web Services Stubs

這時在CXF 2.X中選擇下載下傳的Apache CXF的bin目錄:

第一章 使用SOAPUI測試和開發Web Services Stubs

2.        在如下界面:

第一章 使用SOAPUI測試和開發Web Services Stubs

輸入如下資訊:

l  WSDL:<chapter1 samples>/soap/invoicev1/wsdl/invoice_v1.wsdl,如果這已經填了,在CustomArgs中的Tool Args中就不需要填寫,不讓回報錯!

l  Output directory:生成代碼存放的位置。例如: <chapter1 samples>/soap/invoicev1/src/main/java

l  Package:生成源代碼的包名,例如:ws.invoice.v1

l  Artifact Options:隻選擇Server和Implementation。對于,client與build.xml 也是可用的。我們使用SoapUI作為用戶端且不需要Ant

第一章 使用SOAPUI測試和開發Web Services Stubs

3.        為了自動編譯生成的服務代碼,在Advanced的Tab下:

第一章 使用SOAPUI測試和開發Web Services Stubs

進行如下操作:

l  選擇Compile。

l  提供一個ClassFolder值,作為存放結果Java類檔案的存放目錄,例如:<chapter1 samples>/soap/invoicev1/target/classes

l  選中“ValidateWSDL(可選)”檢查WSDL檔案(在進階Tab下檢查結構和使用基礎WS-I編譯檢查WSDL)。Invoice_v1.wsdl不應該輸出任何東西。

第一章 使用SOAPUI測試和開發Web Services Stubs

4.        在Custom Args Tab下,把WSDL所在位置輸入在Tool Args中。這告訴web服務在運作時從哪裡找到WSDL檔案。設定像invoice_v1.wsdl的值是被期望作為classes的根目錄。

第一章 使用SOAPUI測試和開發Web Services Stubs

PS:如果在Basic Tab下的WSDL路徑已經填寫了,這裡就不需要填寫,如果填寫了,會報錯誤“WSDLToJava Error”:

第一章 使用SOAPUI測試和開發Web Services Stubs

5.        點選”Genrate”按鈕。如果執行成功,輸出類似如下的結果:

第一章 使用SOAPUI測試和開發Web Services Stubs

      可以在輸出檔案路徑下,看到成的Java源碼檔案,輸出檔案路徑例如:<chapter1 samples>/soap/invoicev1/src/main/java/ws/invoice/v1/。在class目錄下關聯class檔案:<chapter1samples>/soap/invoicev1/target/classes/ws/invoice/v1/。

         注意:MAC/LinuxIssue:如果出現一個像“./wsdl2java.sh: No such file or directory”的錯誤,這時解決辦法是:打開<Apache CXF Home>/bin/wsdl2java.sh,然後複制wsdl2java内容到wsdl2java.sh;指令是:cp wsdl2java wsdl2java.sh

6.        在運作服務之前,需要複制invoice_v1.wsdl檔案到生成的類目錄下,例如類目錄為:<chapter1 samples>/soap/invoicev1/target/classes。否則,當運作服務時,将看到一個類似“[failed toocalize]cannot.load.wsdl(invoice_v1.wsdl)”的錯誤。

PS:由于wsdl需要通路​​http://soapui.cookbook.example​​,這個來擷取targetNamespace以及SOAPOperation等,本網站無法通路,造成提示上述問題,以至于下面的服務啟動提示該問題!!!!

7.        最後,啟動服務。執行指令:

cd <chapter1samples>/soap/invoicev1/target/classes

javaws.invoice.v1.InvoicePortType_InvoicePort_Server

       為了确認服務是否啟動成功,打開浏覽器,在浏覽器輸入:​​http://localhost:9001/ws/invoice/v1?wsdl,這時候如果看到invoice_v1.wsdl​​正常顯示,說明生産的服務已經啟動并正常運作。

1.2.3 如何工作

         SoapUI實際上正在為各種Web服務架構建構指令行參數。在上述的例子中,喜歡使用指令的可以直接運作:<Apache CXF Home>/bin/wsdl2java

n  注意:Apache CXF wsdl2javascript

關于wsdl2java的資訊,可以看:​​http://cxf.apache.org/docs/wsdl-to-java.html​​, 快速看下生成的源檔案。主要包括如下幾點:

1.        運作wsdl2java選項生成Java标準的JAX-WS Web服務代碼,該代碼帶有源自WSDL檔案的類型和方法。

2.        Java JDK附帶一個JAX-WS的實作:

²  不需要任何編譯或者運作時依賴的庫,例如:Apache CXF庫

²  不需要servlet容器來釋出web服務,例如Tomcat或者Jetty。如果檢視InvoicePortType_InvoicePort_Server.java,可看到服務已經被釋出,釋出的服務使用的是JDK預設的HTTP服務中的javax.xml.ws.Endpoint類。這個靜态的Endpoint.publish(…)方法綁定生成的服務implementation(InvoicePortImpl.java)到endpoint 位址,以至于invoice請求能被getInvoice()方法處理。

²  該服務是非常容易移植的,隻需要一個Java JRE就能運作它

²  在運作時需要WSDL檔案。​​wsdlLocation參數被應用于第4步,被設定成InvoicePortImpl.java類中@javax.jws.webService​​注釋的一個屬性。

²  服務的Emdpoint和逾時(預設值為5分鐘)很容易更改。對InvoicePortType_InvoicePort_Server.java進行如下修改:

l  Endpoint: String address="http://localhost:9001/ws/invoice/v1";