前面的文章中已经介绍过了若是得到响应数据,接下来咱们来介绍一下应该如何来验证这些得到的响应数据,好比验证状态码、状态行、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));