rest-assured之驗證響應數據(Verifying Response Data)

  前面的文章中已經介紹過了若是得到響應數據,接下來咱們來介紹一下應該如何來驗證這些得到的響應數據,好比驗證狀態碼、狀態行、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));
相關文章
相關標籤/搜索