使用 soapUI 測試 REST 服務
REST 服務介紹
REST(Representational State Transfer)是 Roy Fielding 博士在 2000 年提出的一種新的軟體架構風格,它以資源(resource)為核心,使用 HTTP、 URI、XML 以及 HTML 等現有流行協議和標準來完成對資源的操作及顯示。 這些操作包括獲取、建立、修改和刪除資源,分別對應於 HTTP 協議的 GET、POST、PUT 和 DELETE 方法。REST 架構定義了以下設計準則:
- 網路中的所有事物都被抽象為資源(resource)。
- 每個資源對應一個唯一的資源標識(resource identifier)。
- 通過通用的聯結器介面(generic connector interface)對資源進行操作。
- 對資源的各種操作不會改變資源標識。
- 所有的操作都是無狀態的(stateless)。
REST 服務(RESTful Service)是一種基於 HTTP 和 REST 準則的輕量級 Web 服務。這類服務可以看作一系列資源(resource)的集合,服務的定義可以視為以下三個切面的組合 :
- 訪問 Web Service 的 URI,如:http://example.com/resources。
- Web Service 所支援的資料 MIME 型別,如:JSON, XML, YAML 等。
- Web Service 使用 HTTP 協議支援的操作,如 GET, POST, PUT, DELETE。
相比目前流行的 Web 服務實現方案 SOAP 和 XML-RPC, REST 服務更加簡潔,它可以完全通過 HTTP 協議實現,還可以利用快取 Cache 來提高響應速度, 其效能,效率和易用性等方面均優於 SOAP 協議。 本文主要介紹如何使用 soapUI 來測試此類 Web 服務。
soapUI 介紹
由於 Web 服務是被程式呼叫的, 一般不會提供介面讓終端使用者或測試人員直接使用,在 soapUI 等工具出現之前,測試人員不得不自己編寫程式來測試它, 這就要求測試人員花費很大的精力瞭解底層的介面,呼叫關係和詳細的協議,導致他們不能把注意力集中到測試中。
soapUI 的出現極大的改變了這一局面。 作為一個開源的工具,soapUI 強大的功能、易用的介面,吸引了很多使用者。使用者可以在 soapUI 中通過簡單的操作完成複雜的測試,不需要了解底層的細節, 極大的減輕了工作量。soapUI 支援多樣的測試, 例如功能測試,效能測試,迴歸測試等。到目前為止 soapUI 的下載量已經超過了 100 萬次,成為了事實的 Web 服務測試標準和領先的 Web 服務測試工具。 它不僅僅可以測試基於 SOAP 的 Web 服務,也可以測試 REST 風格的 Web 服務,後者也是本文介紹的重點。
soapUI 基於 Java 開發,支援多個平臺,安裝非常簡單。讀者可以到 soapUI 的 官方網站下載一個安裝包 ( 本文使用的是 Window 版本 3.0.1),直接安裝即可。在該安裝包中,包括了一個 soapUI 所需要的 JRE1.6 版本。安裝完畢以後,讀者需要設定 JAVA_HOME 變數指向到相應的 JRE 目錄,同時修改 PATH 變數,將 JRE1.6 的 bin 目錄新增進去。
REST 服務案例
為了避免空洞的講解,同時為了更好的展示 soapUI 對 REST 服務的測試功能,本文假想了一個線上書店 (http://www.example.com) 的例子。該線上書店對外提供了一些 REST 服務讓第三方的應用程式呼叫。 為了讓讀者把注意力集中在使用 soapUI 進行測試上,我們對這些 REST 服務進行了必要的簡化,僅僅只包含下面 3 種功能:書籍列表,書籍詳情和新增評論。這 3 個 REST 服務覆蓋了層次狀的 REST 資源、基本的 HTTP 操作和多種展現形式。
服務名稱 | HTTP 操作 | 資源 URI | 資源展現 |
---|---|---|---|
書籍列表 | GET | http://www.example.com/books | application/json,text/xml |
書籍詳情 | GET | http://www.example.com/books/<book id > | application/json |
新增評論 | POST | http://www.example.com/books/<book id >/comments | 無 , 系統僅僅返回 200 OK |
清單 1. 書籍列表 application/json
1 2 3 4 5 6 7 8 9 10 11 12 |
{"books":
[
{"book":
{
"id":
"1234",
"name":
"book1",
"price":
29
}},
{"book":
{
"id":
"5678",
"name":
"book2",
"price":
18
}}
]}
|
清單 2. 書籍列表 text/xml
1 2 3 4 5 6 7 8 9 10 11 12 |
< bookes >
< book >
< id >1234</ id >
< name |