rest-assured之验证响应数据(Verifying Response Data)
前面的文章中已经介绍过了如果获得响应数据,接下来我们来介绍一下应该如何来验证这些获得的响应数据,比如验证状态码、状态行、cookies、header、content-type以及body体。
1.验证响应体(Response Body)
关于响应体的验证前面的JSON例子和XML例子中已经做过详细的介绍,这里就不再介绍了。
我们也可以使用映射来做,将响应体映射到一个java对象中,关于对象映射前面也已经介绍过了,这里就不再介绍了。
2.验证cookies
get("/x").then().assertThat().cookie("cookieName", "cookieValue"). ..
get("/x").then().assertThat().cookies("cookieName1", "cookieValue1", "cookieName2", "cookieValue2"). ..
get("/x").then().assertThat().cookies("cookieName1", "cookieValue1", "cookieName2", containsString("Value2")). ..
3.验证状态码以及状态行(Status and StatusLine)
get("/x").then().assertThat().statusCode(200). ..
get("/x").then().assertThat().statusLine("something"). ..
get("/x").then().assertThat().statusLine(containsString("some")). ..
4.验证头部(Header)
get("/x").then().assertThat().header("headerName", "headerValue"). ..
get("/x").then().assertThat().headers("headerName1", "headerValue1", "headerName2", "headerValue2"). ..
get("/x").then().assertThat().headers("headerName1", "headerValue1", "headerName2", containsString("Value2")). ..
验证头部我们也可以使用映射功能来做,比如说,我们要验证Content-Length头部是否小于1000。那我们就可以使用映射功能首先将头部的值转化为int,然后在使用 Hamcrest matcher 进行验证之前使用 Integer 封装类:
get("/something").then().assertThat().header("Content-Length", Integer::parseInt, lessThan(1000));
5.验证Content-Type
get("/x").then().assertThat().contentType(ContentType.JSON). ..
6.完全匹配body或content
get("/x").then().assertThat().body(equalTo("something")). ..
7.关联型验证(使用响应体中的数据去验证响应体的另外一些部分)
我们可以使用响应体中的数据去验证响应体的另外一些部分,比如,服务端返回下面Json文件:
{ "userId" : "some-id", "href" : "http://localhost:8080/some-id" }
在上面的json文件中,我们可以注意到"href"属性是以"userId"的值结尾的,假如我们想要验证这样的一个 href ,我们可以通过实现 io.restassured.matcher.ResponseAwareMatcher并且使用它:
get("/x").then().body("href", new ResponseAwareMatcher<Response>() {
public Matcher<?> matcher(Response response) {
return equalTo("http://localhost:8080/" + response.path("userId"));
}
});
如果我们使用的是Java 8 的话,我们还可以使用 lambda 表达式来做:
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 模型),比如说:
get("/x").then().body("href", endsWithPath("userId"));
RestAssuredMatchers 也可以与另外一个 RestAssuredMatchers 或者是 Hamcrest Matcher 进行组合来使用,例如:
get("/x").then().body("href", and(startsWith("http:/localhost:8080/"), endsWithPath("userId")));
这里的 and 方法是从 io.restassured.matcher.ResponseAwareMatcherComposer 类中静态导入的。
8.验证响应时间
rest-assured的2.8.0版本开始支持获取响应时间,例如:
long timeInMs = get("/lotto").time()
或者也可以指定时间单位:
long timeInSeconds = get("/lotto").timeIn(SECONDS);
其中 SECONDS 是一个标准的 TimeUnit ,使用验证DSL也可以验证响应时间:
when().
get("/lotto").
then().
time(lessThan(2000L)); // Milliseconds
或者:
when().
get("/lotto").
then().
time(lessThan(2L), SECONDS);
注意,响应时间计算的执行需要JVM是热部署的(例如,只是简单的跑一个test来执行响应时间的衡量将会产生错误的结果)
需要注意的是,我们上面的响应时间只能做为一个参考,并不能非常精准的与服务器处理时间相关联(因为响应时间将会包括http往返的时间和rest-assured处理时间等其他时间)。
9.路径参数方式验证
当请求路径中包含有预定义的变量时,路径参数是非常有用的,比如:
String someSubPath = "else";
int index = 1;
get("/x").then().body("something.%s[%d]", withArgs(someSubPath, index), equalTo("some value")). ..
上面的例子将会断言:请求体路径"something.else[0]" 是否等于 "some value"。
另外一个用处是当我们的根路径(root path)非常复杂时,又不想因为一些小的改变而使用重复的路径,我们可以这样做:
when().
get("/x").
then().
root("filters.filterConfig[%d].filterConfigGroups.find { it.name == 'GroupName' }.includes").
body(withArgs(0), hasItem("first")).
body(withArgs(1), hasItem("second")).
..
路径参数遵循的是Java的标准格式化语法。
注意:withArgs 方法需要从 io.restassured.RestAssured 类中静态导入。
有时候当所有的参数都在根路径(root path)中已经被指定时,不使用额外的参数来进行响应体的验证也是非常有用的。这里就需要用到 withNoArgs 方法了,例如:
when().
get("/jsonStore").
then().
root("store.%s", withArgs("book")).
body("category.size()", equalTo(4)).
appendRoot("%s.%s", withArgs("author", "size()")).
body(withNoArgs(), equalTo(4));
rest-assured之验证响应数据(Verifying Response Data)的更多相关文章
- rest-assured之获取响应数据(Getting Response Data)
我们使用rest-assured可以获得响应内容,比如:我们发起一个get请求 get("/lotto") 并且获得响应内容,我们有多种方式可以实现: // 通过流的方式获得响应内 ...
- Django 源码小剖: 响应数据 response 的返回
响应数据的返回 在 WSGIHandler.__call__(self, environ, start_response) 方法调用了 WSGIHandler.get_response() 方法, 由 ...
- ASP.NET Core 中文文档 第四章 MVC(2.3)格式化响应数据
原文:Formatting Response Data 作者:Steve Smith 翻译:刘怡(AlexLEWIS) 校对:许登洋(Seay) ASP.NET Core MVC 内建支持对相应数据( ...
- Jmeter—4 添加断言 判断响应数据是否符合预期
发出请求之后,通过添加断言可以判断响应数据是否是我们的预期结果. 1 在Jmeter中发送一个登录的http请求(参数故意输入错误).结果肯定是登陆失败啦. 但结果树中http请求的图标显示‘绿色’表 ...
- Jmeter—添加断言 判断接口响应数据是否符合预期
发出请求之后,通过添加断言可以判断响应数据是否是我们的预期结果. 1 在Jmeter中发送一个状态返回200的http请求(参数故意输入错误).结果肯定是不是返回200啦. 但结果树中http请求的图 ...
- Jmeter入门4 添加断言 判断响应数据是否符合预期
发出请求之后,通过添加断言可以判断响应数据是否是我们的预期结果. 1 在Jmeter中发送一个登录的http请求(参数故意输入错误).结果肯定是登陆失败啦. 但结果树中http请求的图标显示‘绿色’表 ...
- Jmeter正则提取请求响应数据
前言 在测试时,我们经常需处理请求返回的响应数据,比如很多时候 cookie 或 token 或 Authorization授权码 会返回在 Response headers(响应头)中,这时我们便需 ...
- ASP.NET Web API 记录请求响应数据到日志的一个方法
原文:http://blog.bossma.cn/dotnet/asp-net-web-api-log-request-response/ ASP.NET Web API 记录请求响应数据到日志的一个 ...
- Java框架之SpringMVC 03-RequestMapping-请求数据-响应数据
SpringMVC SpringMVC是一种轻量级的.基于MVC的Web层应用框架. 通过一套 MVC 注解,让 POJO 成为处理请求的控制器,而无须实现任何接口. 采用了松散耦合可插拔组件结构,比 ...
随机推荐
- code1225 八数码Bfs
Bfs搜索 1.把棋盘直接作为状态: #include<iostream> #include<cstring> #include<queue> #include&l ...
- Red Hat 6.5 Samba服务器的搭建(登录访问)
搭建Samba服务器是为了实现Linux共享目录之后,在Windows可以直接访问该共享目录. 现在介绍如何在红帽6.5系统中搭建Samba服务. 搭建Samba服务之前,yum源必须配置好,本地源和 ...
- Redis 数据库学习
安装(mac) 使用homebrew安装,命令是:brew install redis. 安装完成后启动命令:brew services start redis. 使用命令redis-cli进入red ...
- php eval
// Our PHP code inside a variable $phpCode = ' class Foo { private $name; public function __construc ...
- RDD介绍与执行
repartition 增加或减少分区.会产生shuffle.(多个分区分到一个分区不会产生shuffle) coalesce coalesce常用来减少分区,第二个参数是减少分区的过程中是否产生sh ...
- 洛谷P2173 [ZJOI2012]网络(10棵lct与瞎jb暴力)
有一个无向图G,每个点有个权值,每条边有一个颜色.这个无向图满足以下两个条件: 对于任意节点连出去的边中,相同颜色的边不超过两条. 图中不存在同色的环,同色的环指相同颜色的边构成的环. 在这个图上,你 ...
- Javascript 链式作用域 function fn(){}和var fn=function(){}区别
其实对于Javascript链式作用域的描述,包括,JS权威指南,都有些太冗长了--但是很准确:JavaScript中的函数运行在他们被定义的作用域里,而不是他们被执行的作用域里. 这句话有点难懂,但 ...
- [SIP01]SIP Header Fields里面各字段用途
INVITE sip:bob@biloxi.com SIP/2.0 Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bK776asdhds Max-Forw ...
- Elasticsearch(1.1.1)基础教程pdf
基础概念 Elasticsearch有几个核心概念.从一开始理解这些概念会对整个学习过程有莫大的帮助. 接近实时(NRT) Elasticsearch是一个接近实时的搜索平台.这意味着, ...
- MVC下EF添加上下文
这里我们用Code First方法创建数据库表.这个方法简单点说就是先创建Model再根据Model生成数据库表. 为了方便起见,这里用的数据库是Visual Studio自带的LocalDb. 数据 ...