java 的 mvn 依赖中有一个 httpclient 工具可以做到接口的访问,但是如果用 httpclient 去写大量的接口请求,会显得非常复杂且臃肿(除非你自己对 httpclient 进行封装弄一个好用的框架),如果我们使用 REST assured 来做大量的接口测试,则能大大提高脚本开发效率
是一个能够简化测试rest服务的 Java DSL,像 ruby 或者 python 一样的动态语言去测试和验证 http 服务。基于 java 并且兼容了 groovy 动态语言的特性,使我们像写脚本语言一样去测试 http 服务
<dependency>
<groupId>io.rest-assuredgroupId>
<artifactId>rest-assuredartifactId>
<version>4.2.0version>
dependency>
get 访问百度,返回响应码,以及响应体信息
given()
.get("https://www.baidu.com")
.then()
.statusCode(200)
.log().all();
如果要做断言,REST assured 支持直接在 body() 中判断,而不是显示的直接使用 assert 去断言
given().when()
.get()
.then()
.body("xxx", Matchers.equalTo("xxx"));
当然还可以使用 post 请求,还有指定请求的 contenttype 等等
对于提取返回的响应我们建议使用如下形式,它会返回一个 Response 对象,然后再通过 Response 中的 path() 方法即可拿到想要的 json 数据
given()
.contentType("application/json")
.put("xxx")
.then()
.extract().response();
请求头有的需要添加一些必要信息,也就是键值对的形式
given().when()
.header("aaa", "bbb")
.get("...")
.then()
.log().all();
一种思路是你直接写进 get() 方法中肯定 ok,另一种思路是你通过 param() 方法或者 params() 方法也是 ok 的
given().when()
.param("xxx", "yyy")
.param("aaa", "bbb")
.get("...")
.then()
.log().all();
和上面 GET 中使用方法一致
contentType 为请求格式,你直接写成 “application/json” 也是没有问题的
given()
.contentType(ContentType.JSON)
.put("xxx")
.then()
.log().all();
given()
.contentType(ContentType.JSON)
.body("某个 json 字符串")
.put("xxx")
.then()
.log().all();
用来提取信息响应信息,比如常见的提取响应体的 json 信息,返回的 Response 对象,我们从 Response 中调用 path() 方法可以拿到指定键的值
given()
.contentType("application/json")
.put("xxx")
.then()
.extract().response();
通常 ValidatableResponse 会有 extract() 这个方法,所以对于下面几种写法都是可以调用 extrat()
// 方式一
.then()
.extract().response();
// 方式二(方式二只不过比方式一多了 log 输出,其他效果同)
.then().log().all()
.extract().response();
// 方式三(方式三也是多了个 log)
.then().log().body()
.extract().response();
// 方式四(比方式一多了一个断言机制)
.then().body(Matchers 断言匹配与否)
.extract().resposne();
// 方式五(和方式四一样,多了一个 log 日志)
.then().log().all().body(Matchers 断言匹配与否)
.extract().response();
当我们加上 log 后便于我们在控制台可以很方便的查看到 log 日志输出,输出的是接口响应返回的结果,下面举了个简单的 PUT 的例子
given()
.contentType(ContentType.JSON)
.body("某个 json 字符串")
.put("xxx")
.then()
.log().all();
REST assured 可以使用 body() 方法中的 hamcrest 依赖的 Matcher 来直接代替断言,或者使用 Response 提取字段来 assert,具体的使用可以查看博主的另一篇博文https://blog.csdn.net/abcnull/article/details/108062414
当然这类还会介绍一些 REST assured 断言的细节,比如对于 json 的数据使用很灵活的层级关系去匹配断言
given()
.contentType(ContentType.JSON)
.body("某个 json 字符串")
.put("xxx")
.then()
.body("aaa.bbb", Matchers.is("ccc"))
而产生响应的 json 是如下
{
"aaa" : {
"bbb" : "ccc"
}
}
而对于 json 中同键名有多个怎么断言呢?或者说 json 中存在数组的形式,数组中可能不同元素中有重名的键。代码如下
given()
.contentType(ContentType.JSON)
.body("某个 json 字符串")
.put("xxx")
.then()
.body("aaa.bbb", Matchers.haItem("ccc", "ddd"))
json 如下
{
"aaa" : [{
"bbb" : "ccc"
},{
"bbb" : "ddd"
}]
}
同时值得注意的是 body() 后可以接着 body() 连着写进而连着断言。REST assured 的 body() 方法中可以做非常丰富且灵活的断言,还需要自行探索!