zoukankan      html  css  js  c++  java
  • rest-assured之验证响应数据(Verifying Response Data)

      前面的文章中已经介绍过了如果获得响应数据,接下来我们来介绍一下应该如何来验证这些获得的响应数据,比如验证状态码、状态行、cookies、header、content-type以及body体。

    1.验证响应体(Response Body)

      关于响应体的验证前面的JSON例子和XML例子中已经做过详细的介绍,这里就不再介绍了。

      我们也可以使用映射来做,将响应体映射到一个java对象中,关于对象映射前面也已经介绍过了,这里就不再介绍了。

    2.验证cookies

    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)

    1 get("/x").then().assertThat().statusCode(200). ..
    2 get("/x").then().assertThat().statusLine("something"). ..
    3 get("/x").then().assertThat().statusLine(containsString("some")). ..

    4.验证头部(Header)

    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 封装类:

    1 get("/something").then().assertThat().header("Content-Length", Integer::parseInt, lessThan(1000));

    5.验证Content-Type

    1 get("/x").then().assertThat().contentType(ContentType.JSON). ..

    6.完全匹配body或content 

    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));
  • 相关阅读:
    一款jquery写出来的tab切换
    mouseenter 事件,固定右侧客服特效
    一款兼容pc 移动端的tab切换
    EhCache缓存
    HTML5中与页面显示相关的API
    JAVA获取客户端IP地址
    Oracle11g导出空表
    css兼容问题集合
    使用Java修改Windows注册表
    常用的SQL分页
  • 原文地址:https://www.cnblogs.com/lwjnicole/p/8298132.html
Copyright © 2011-2022 走看看