使用 Rest-Assured 測試 REST API

安裝和使用

首先,讀者須要訪問 Rest-Assured 的官方網站下載最新版本的 Rest-Assured。寫做此文時,做者使用的是 2.4.1,下載解壓成功後,會發現軟件包還包含了其餘第三方依賴,這些都是運行期須要的類庫,確保將它們都加入你的 classpath。java

如今咱們以豆瓣 API 爲例,簡單介紹一下 Rest-Assured 的使用方法。爲此,咱們須要安裝一個 REST 客戶端插件方便調試。若是使用 FireFox 瀏覽器,可安裝 RESTClient 插件,安裝成功後,在地址一欄輸入:http://api.douban.com/v2/book/1220562,方法選擇 GET,請求發送成功後,會返回以下 JSON 字符串:git

清單 1. 豆瓣讀書 API 返回結果
{
 "id":"1220562",
 "alt":"http:\/\/book.douban.com\/book\/1220562",
 "rating":{"max":10, "average":"7.0", "numRaters":282, "min":0},
 "author":[{"name":"片山恭一"}, {"name":"豫人"}],
 "alt_title":"",
 "image":"http:\/\/img1.douban.com\/spic\/s1747553.jpg",
 "title":"滿月之夜白鯨現",
 "mobile_link":"http:\/\/m.douban.com\/book\/subject\/1220562\/",
 "summary":"那一年,是聽莫扎特、釣鱸魚和家庭破裂的一年。",
 "attrs":{ 
 "publisher":["青島出版社"],
 "pubdate":["2005-01-01"],
 "author":["片山恭一", "豫人"],
 "price":["18.00 元"],
 "title":["滿月之夜白鯨現"],
 "binding":["平裝 (無盤)"],
 "translator":["豫人"],
 "pages":["180"]
 },
 "tags":[
 {"count":106, "name":"片山恭一"},
 {"count":50, "name":"日本"},
 {"count":42, "name":"日本文學"},
 {"count":30, "name":"滿月之夜白鯨現"},
 {"count":28, "name":"小說"},
 {"count":10, "name":"愛情"},
 {"count":7, "name":"純愛"},
 {"count":6, "name":"外國文學"}
 ]
}

如今,咱們使用 Rest-Assured 來編寫一個簡單的測試程序調用相同的 API:github

清單 2. DouBanTest.java
//import 要使用的類和方法
import com.jayway.restassured.RestAssured;
import static com.jayway.restassured.RestAssured.*;
import static com.jayway.restassured.matcher.RestAssuredMatchers.*;
import static org.hamcrest.Matchers.*;

public class DouBanTest
{
 @Before
public void setUP(){
 //指定 URL 和端口號
 RestAssured.baseURI = "http://api.douban.com/v2/book";
 RestAssured.port = 80;
 }

 @Test
 public void testGETBook()
 {
 get("/1220562").then().body("title", equalTo("滿月之夜白鯨現"));
 }

}

上面這段測試調用了一樣的 API,返回了一樣的結果,而後檢查其"title"屬性是否爲"滿月之夜白鯨現"。對比上面的 JSON 字符串,咱們知道該測試能夠經過。Rest-Assured 默認訪問的 URL 爲 localhost,端口號爲 8080,這是爲了方便開發人員作測試。若是要訪問互聯網上的 API,須要指定基礎 URL 和端口號,如上面的代碼所示。json

發送請求時,還能夠指定參數,好比咱們使用 Java8 做爲關鍵字,調用豆瓣讀書的查詢 API,可獲得有關 Java8 的圖書:api

清單 3. 帶參數的請求
@Test
 public void testSearchBook(){
 given().param("q", "java8").when().get("/search").then().body("count", equalTo(2));
}

同理,用戶還能夠在發送請求時指定 header、cookie、content type 等選項:數組

清單 4. 指定 header、cookie、content type
given().cookie("name", "xx").when().get("/xxx").then().body();
given().header("name", "xx").when().get("/xxx").then().body();
given().contentType("application/json").when().get("/xxx").then().body();
 

解析 JSON

使用 Rest-Assured 測試 REST API,當請求的 JSON 字符串返回時,須要選取相應的字段進行驗證,Rest-Assured 提供了各類靈活的方式來選擇字段,本節將經過示例,對一些經常使用方式進行說明。瀏覽器

清單 5. 經常使用的 JSON 字段選取方式
 get("/1220562").then()
 //取頂級屬性「title」
 .body("title", equalTo("滿月之夜白鯨現"))
 //取下一層屬性
 .body("rating.max", equalTo(10))
 //調用數組方法
 .body("tags.size()", is(8))
 //取數組第一個對象的「name」屬性
 .body("tags[0].name", equalTo("片山恭一"))
 //判斷數組元素
 .body("author", hasItems("[日] 片山恭一"));

字段的選取方式符合 JSON 的習慣,上面的例程分別展現瞭如何選取多層屬性、數組元素以及調用數組的方法。cookie

Rest-Assured 不只支持 JSON,也支持 XML,讀者可參考文末的連接自行學習。app

 

身份驗證

系統的某些 API 只對註冊用戶開放,Rest-Assured 提供了相應的驗證方法:ide

清單 6. 驗證
given().auth().basic(username, password).when().get("/secured").then().statusCode(200);
given().auth().oauth(..);
given().auth().oauth2(..);
相關文章
相關標籤/搜索