天天看點

第三章 生成與開發測試優先的RESTful Web服務樁

本部分将告訴你如何使用TDD生成與開發一個測試優先的簡單RESTful Web服務。SoapUI的主要學習是如何測試一個由WADL定義的簡單RESTful Web服務,該WADL産生JSON響應。在這裡也能學到使用Apache CXF開發一個基礎的JAX-RS web服務技巧。

3.1 準備階段

         該例子服務是第一章中提到的SOAPinvoice服務的REST版本,該服務通過WADL定義,定義的内容如下:

 u  WADL:invoice_v1.wadl

 u  Service endpoint:​​http://localhost:9000/invoiceservice/v1​​

 u  Resource:GET /invoice/{id}

 u  Produces: application/json

Apache CXF被用于生成、建構、運作Stubweb服務。對于Eclipse使用者,可以設定Apache CXF作為一個運作庫,設定位置是在:Project----Add Library-------CXF Runtime,以java應用程式運作服務類。

3.2 操作步驟

         首先,使用服務的WADL建立一個REST項目,添加一個帶有斷言的TestStep用來檢測響應的invoice的值是否與預期的結果一緻。這時,使用Apache CXF生成一個空的可運作的REST web服務,然後添加一個簡單的實作通過測試。執行步驟如下:

1.        使用invoice_v1.wadl建立一個SoapUI項目。進入“檔案目錄|建立REST項目|導入WADL”,找到檔案“invoice_v1.wadl”,然後點選确認按鈕。在新生成的項目下帶有一個簡單請求,該請求的invoice源帶一個id參數:

第三章 生成與開發測試優先的RESTful Web服務樁

2.        建立一個簡單的測試集、測試用例、帶有斷言的TestStep操作,目的是為了指定期望成功傳回invoice源的請求。使用“Generate TestSuite”操作:

第三章 生成與開發測試優先的RESTful Web服務樁

點選OK,彈出如下彈窗,點選“确定”:

第三章 生成與開發測試優先的RESTful Web服務樁

 點開生成的測試集,截圖如下:

第三章 生成與開發測試優先的RESTful Web服務樁

3.        給TestStep添加一些斷言。例如我們期望Invocie文檔的json文檔格式如下樣式:

{"Invoice": {

"id": 12345,

"companyName": "Test Company",

"amount": 100

}}      

4.        如果是使用SoapUI Pro,可以使用3個JsonPath比對斷言:

Name: IdShouldBe12345

JsonPath: $.Invoice.id

expectedValue: 12345

Name: AmountShouldBe100

JsonPath: $.Invoice.amount

Expected Value: 100

Name: CompanyNameShouldBeTestCompany

JsonPath: $.Invoice.companyName

Expected Value: Test Company

5.        如果是開源的SoapUI,可以使用3個contains斷言:

Name: ShouldContainText12345

Contains Content: 12345

Name: ShouldContainTextTestCompany

Contains Content: Test Company

Name: ShouldContainText100

Contains Content: 100

 6.        在SoapUI的兩個版本都可以檢查HTTP的狀态是否為200,通過添加一個有效的HTTP Status Codes斷言:

Name: ShouldReturnHTTPStatus200

HTTP Status Code = 200

 7.        現在測試已經準備好,需要生成一個可操作服務。可以使用Apache CXF的wadljava腳本使用WADL生成一個空的可執行的Java服務。不幸的是,在SoapUI 5.0版本,WADL2Java功能已經使用傳統的wadl2java寫。這個版本的wadl2java隻能使用WADL生成用戶端代碼,而不能生成我們需要的服務端代碼。

8.        當然,直接使用Apache CXF生成web服務代碼不是SoapUI的一部分。我提供這些完整步驟以防萬一他們對你有用。如果你想跳過這個步驟,在<chapter 1 samples>/rest/invoicev1_gen下有生成的代碼。否則,通過運作wadl2java生成web服務代碼,例如:

第三章 生成與開發測試優先的RESTful Web服務樁

MacOSX/Linux的Classpath問題:當使用Apache CXF 運作wadl2java,如果看到問題:“Could not find or load main classorg.apache.cxf.tools.wadlto.WADLToJava”,這是需要手動設定Classpath變量:exportCLASSPATH=apache-cxf-3.0.1/lib/* 解決這個問題。

Windows也要設定好Apache CXF的classpath:

第三章 生成與開發測試優先的RESTful Web服務樁

  生成的檔案截圖:

第三章 生成與開發測試優先的RESTful Web服務樁

9.     需要編譯生成的服務。Apache CXF的庫需要classpath(-cp參數):   

cd <chapter1 samples>/rest/invoicev1/src/main/java/rest/invoice/v1/

javac  -d <chapter1 samples>/rest/invoicev1/target/classes/ *.java

10.    執行如下指令運作服務:

第三章 生成與開發測試優先的RESTful Web服務樁

11.    在浏覽器端輸入:​​http://localhost:9000/invoiceservice/v1?_wadl​​,将看到一個WADL檔案表明伺服器在運作:

第三章 生成與開發測試優先的RESTful Web服務樁

12.    運作之前建立的測試用例:

q n  打開并編輯建立的測試用例

 n  給TestStep的請求中添加一個invoiceID,例如:12345

 n  運作之前添加的斷言測試用例會失敗,而且響應的狀态碼為204,在Raw Tab下沒有内容。這是因為沒有實施的操作

 運作執行個體源碼在服務端會出現下圖所示問題,解決辦法在invoice.java中修改已經指出:

第三章 生成與開發測試優先的RESTful Web服務樁

 修改後進行編譯,然後啟動服務,運作測試用例,響應結果如下:

第三章 生成與開發測試優先的RESTful Web服務樁

13.  如果使用本書操作執行個體,不需要此步操作,在對應目錄下存在操作執行個體源碼,如果沒有需要建立InvoiceserviceV1ResourceImpl.java:

/**

 * Created by Apache CXF WadlToJava code generator

**/

package rest.invoice.v1;

public class InvoiceserviceV1ResourceImpl implements InvoiceserviceV1Resource {

 

 

    public Invoice getInvoiceid(String id) {

        ObjectFactory objectFactory = new ObjectFactory();

        Invoice invoice = objectFactory.createInvoice();

        invoice.setId("12345");

        invoice.setCompanyName("Test Company");

        invoice.setAmount(100.0d);

        return invoice;

    }

 

}