本部分将告訴你如何使用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參數:

2. 建立一個簡單的測試集、測試用例、帶有斷言的TestStep操作,目的是為了指定期望成功傳回invoice源的請求。使用“Generate TestSuite”操作:
點選OK,彈出如下彈窗,點選“确定”:
點開生成的測試集,截圖如下:
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服務代碼,例如:
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:
生成的檔案截圖:
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. 執行如下指令運作服務:
11. 在浏覽器端輸入:http://localhost:9000/invoiceservice/v1?_wadl,将看到一個WADL檔案表明伺服器在運作:
12. 運作之前建立的測試用例:
q n 打開并編輯建立的測試用例
n 給TestStep的請求中添加一個invoiceID,例如:12345
n 運作之前添加的斷言測試用例會失敗,而且響應的狀态碼為204,在Raw Tab下沒有内容。這是因為沒有實施的操作
運作執行個體源碼在服務端會出現下圖所示問題,解決辦法在invoice.java中修改已經指出:
修改後進行編譯,然後啟動服務,運作測試用例,響應結果如下:
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;
}
}