前面的文章中已經介紹過了若是得到響應數據,接下來咱們來介紹一下應該如何來驗證這些得到的響應數據,好比驗證狀態碼、狀態行、cookies、header、content-type以及body體。html
1.驗證響應體(Response Body)java
關於響應體的驗證前面的JSON例子和XML例子中已經作過詳細的介紹,這裏就再也不介紹了。json
咱們也可使用映射來作,將響應體映射到一個java對象中,關於對象映射前面也已經介紹過了,這裏就再也不介紹了。服務器
2.驗證cookiescookie
1 get("/x").then().assertThat().cookie("cookieName", "cookieValue"). .. 2 get("/x").then().assertThat().cookies("cookieName1", "cookieValue1", "cookieName2", "cookieValue2"). .. 3 get("/x").then().assertThat().cookies("cookieName1", "cookieValue1", "cookieName2", containsString("Value2")). ..
3.驗證狀態碼以及狀態行(Status and StatusLine)mvc
1 get("/x").then().assertThat().statusCode(200). .. 2 get("/x").then().assertThat().statusLine("something"). .. 3 get("/x").then().assertThat().statusLine(containsString("some")). ..
4.驗證頭部(Header)app
1 get("/x").then().assertThat().header("headerName", "headerValue"). .. 2 get("/x").then().assertThat().headers("headerName1", "headerValue1", "headerName2", "headerValue2"). .. 3 get("/x").then().assertThat().headers("headerName1", "headerValue1", "headerName2", containsString("Value2")). ..
驗證頭部咱們也可使用映射功能來作,好比說,咱們要驗證Content-Length頭部是否小於1000。那咱們就可使用映射功能首先將頭部的值轉化爲int,而後在使用 Hamcrest matcher 進行驗證以前使用 Integer 封裝類:less
1 get("/something").then().assertThat().header("Content-Length", Integer::parseInt, lessThan(1000));
5.驗證Content-Typespa
1 get("/x").then().assertThat().contentType(ContentType.JSON). ..
6.徹底匹配body或content rest
1 get("/x").then().assertThat().body(equalTo("something")). ..
7.關聯型驗證(使用響應體中的數據去驗證響應體的另一些部分)
咱們可使用響應體中的數據去驗證響應體的另一些部分,好比,服務端返回下面Json文件:
1 { "userId" : "some-id", "href" : "http://localhost:8080/some-id" }
在上面的json文件中,咱們能夠注意到"href"屬性是以"userId"的值結尾的,假如咱們想要驗證這樣的一個 href ,咱們能夠經過實現 io.restassured.matcher.ResponseAwareMatcher而且使用它:
1 get("/x").then().body("href", new ResponseAwareMatcher<Response>() { 2 public Matcher<?> matcher(Response response) { 3 return equalTo("http://localhost:8080/" + response.path("userId")); 4 } 5 });
若是咱們使用的是Java 8 的話,咱們還可使用 lambda 表達式來作:
1 get("/x").then().body("href", response -> equalTo("http://localhost:8080/" + response.path("userId"));
io.restassured.matcher.RestAssuredMatchers 這個類中還定義了一些預約義的machers可使用(或者 io.restassured.module.mockmvc.matcher.RestAssuredMockMvcMatchers類,若是咱們使用的是Spring-mock-mvc 模型),好比說:
1 get("/x").then().body("href", endsWithPath("userId"));
RestAssuredMatchers 也能夠與另一個 RestAssuredMatchers 或者是 Hamcrest Matcher 進行組合來使用,例如:
1 get("/x").then().body("href", and(startsWith("http:/localhost:8080/"), endsWithPath("userId")));
這裏的 and 方法是從 io.restassured.matcher.ResponseAwareMatcherComposer 類中靜態導入的。
8.驗證響應時間
rest-assured的2.8.0版本開始支持獲取響應時間,例如:
1 long timeInMs = get("/lotto").time()
或者也能夠指定時間單位:
1 long timeInSeconds = get("/lotto").timeIn(SECONDS);
其中 SECONDS 是一個標準的 TimeUnit ,使用驗證DSL也能夠驗證響應時間:
1 when(). 2 get("/lotto"). 3 then(). 4 time(lessThan(2000L)); // Milliseconds
或者:
1 when(). 2 get("/lotto"). 3 then(). 4 time(lessThan(2L), SECONDS);
注意,響應時間計算的執行須要JVM是熱部署的(例如,只是簡單的跑一個test來執行響應時間的衡量將會產生錯誤的結果)
須要注意的是,咱們上面的響應時間只能作爲一個參考,並不能很是精準的與服務器處理時間相關聯(由於響應時間將會包括http往返的時間和rest-assured處理時間等其餘時間)。
9.路徑參數方式驗證
當請求路徑中包含有預約義的變量時,路徑參數是很是有用的,好比:
1 String someSubPath = "else"; 2 int index = 1; 3 get("/x").then().body("something.%s[%d]", withArgs(someSubPath, index), equalTo("some value")). ..
上面的例子將會斷言:請求體路徑"something.else[0]" 是否等於 "some value"。
另一個用處是當咱們的根路徑(root path)很是複雜時,又不想由於一些小的改變而使用重複的路徑,咱們能夠這樣作:
1 when(). 2 get("/x"). 3 then(). 4 root("filters.filterConfig[%d].filterConfigGroups.find { it.name == 'GroupName' }.includes"). 5 body(withArgs(0), hasItem("first")). 6 body(withArgs(1), hasItem("second")). 7 ..
路徑參數遵循的是Java的標準格式化語法。
注意:withArgs 方法須要從 io.restassured.RestAssured 類中靜態導入。
有時候當全部的參數都在根路徑(root path)中已經被指定時,不使用額外的參數來進行響應體的驗證也是很是有用的。這裏就須要用到 withNoArgs 方法了,例如:
1 when(). 2 get("/jsonStore"). 3 then(). 4 root("store.%s", withArgs("book")). 5 body("category.size()", equalTo(4)). 6 appendRoot("%s.%s", withArgs("author", "size()")). 7 body(withNoArgs(), equalTo(4));