接口测试 rest-assured 使用指南
注意,如果您正在使用 1.9.0 或者更早的版本请参考旧文档。
REST Assured 是一个可以简化 HTTP Builder 顶层 基于 REST 服务的测试过程的 Java DSL(针对某一领域,具有受限表达性的一种计算机程序设计语言)。它支持发起 POST,GET,PUT,DELETE,OPTIONS,PATCH 和 HEAD 请求,并且可以用来验证和校对这些请求的响应信息。
目录
- 静态导入方法
- 示例
- 关于 float 和 double
- 语法关注点 (语法糖)
- 获得响应体信息
- 获得响应信息
- 指定请求数据
- 验证响应信息
- 认证
- Multi-part 类型的表单数据
- 对象映射
- 解析器
- 默认值
- 模式复用
- 过滤器
- 日志
- 根路径
- Session 支持
- SSL
- URL 编码
- 代理(proxy)配置
- 详细配置
- Spring Mock Mvc 模型
- Scala 支持
- Kotlin 支持
- 更多
静态导入方法
推荐大家从以下的类中静态导入方法,以提高使用 rest-assured 的效率。
io.restassured.RestAssured.*
io.restassured.matcher.RestAssuredMatchers.*
org.hamcrest.Matchers.*
如果您想使用Json Schema validation 还应该静态导入这些方法:
io.restassured.module.jsv.JsonSchemaValidator.*
更多使用方法参阅 Json Schema Validation 。
如果您正在使用 SpringMVC,你可以使用spring-mock-mvc 模型的 Rest Assured DSL 来对 Spring 的 controller 层进行单元测试。为此需要从RestAssuredMockMvc静态导入这些方法,而不是io.restassured.RestAssured
:
io.restassured.module.mockmvc.RestAssuredMockMvc.*
示例
例一 – JSON
假设某个 get 请求 (to http://localhost:8080/lotto) 返回 JSON 如下:
{
"lotto":{
"lottoId":5,
"winning-numbers":[2,45,34,23,7,5,3],
"winners":[{
"winnerId":23,
"numbers":[2,45,34,23,3,5]
},{
"winnerId":54,
"numbers":[52,3,12,11,18,22]
}]
}
}
REST assured 可以帮您轻松地进行 get 请求并对响应信息进行处理。举个例子,如果想要判断 lottoId 的值是否等于 5,你可以这样做:
get("/lotto").then().body("lotto.lottoId", equalTo(5));
又或许您想要检查 winnerId 的取值包括23 和 54:
get("/lotto").then().body("lotto.winners.winnerId", hasItems(23, 54));
注意: equalTo
和 hasItems
是 Hamcrest matchers 的方法,所以需要静态导入 org.hamcrest.Matchers
。
注意这里的”json path”语法使用的是Groovy 的 GPath标注法,不要和 Jayway 的JsonPath语法混淆。
以 BigDecimal 返回 float 和 double 类型
(译者注:Java 在 java.math 包中提供的 API 类 BigDecimal,用来对超过 16 位有效位的数进行精确的运算)
您可以对 rest-assured 和 JsonPath 进行配置,使之以 BigDecimal 返回 json 里的数值类型数据,而不是 float 或者 double。可以参考下面 json 文本:
{
"price":12.12
}
默认情况下您验证 price 字段是否等于 float 类型的 12.12 像这样:
get("/price").then().body("price", is(12.12f));
但是如果想用 rest-assured 的 JsonConfig 来配置返回的所有的 json 数值都为 BigDecimal 类型:
given().
config(RestAssured.config().jsonConfig(jsonConfig().numberReturnType(BIG_DECIMAL))).
when().
get("/price").
then().
body("price", is(new BigDecimal(12.12));
JSON Schema validation
自从 2.1.0
版本 rest-assured 开始支持Json Schema validation. 举个例子,在 classpath 中放置以下的 schema 文件(译者注:idea 的话可以放在 resources 目录下),products-schema.json:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "Product set",
"type": "array",
"items": {
"title": "Product",
"type": "object",
"properties": {
"id": {
"description": "The unique identifier for a product",
"type": "number"
},
"name": {
"type": "string"
},
"price": {
"type": "number",
"minimum": 0,
"exclusiveMinimum": true
},
"tags": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"uniqueItems": true
},
"dimensions": {
"type": "object",
"properties": {
"length": {"type": "number"},
"width": {"type": "number"},
"height": {"type": "number"}
},
"required": ["length", "width", "height"]
},
"warehouseLocation": {
"description": "Coordinates of the warehouse with the product",
"$ref": "