使用 Rest-Assured 测试 REST API

现在,越来越多的 Web 应用转向了 RESTful 的架构,很多产品和应用暴露给用户的往往就是一组 REST API,这样有一个好处,用户可以根据需要,调用不同的 API,整合出自己的应用出来。从这个角度来讲,Web 开发的成本会越来越低,人们不必再维护自己的信息孤岛,而是使用 REST API 互联互通。

那么,作为 REST API 的提供者,如何确保 API 的稳定性与正确性呢?全面系统的测试是必不可少的。Java 程序员常常借助于 JUnit 来测试自己的 REST API,不,应该这样说,Java 程序员常常借助于 JUnit 来测试 REST API 的实现!从某种角度来说,这是一种“白盒测试”,Java 程序员清楚地知道正在测试的是哪个类、哪个方法,而不是从用户的角度出发,测试的是哪个 REST API。Rest-Assured 是一套由 Java 实现的 REST API 测试框架,它是一个轻量级的 REST API 客户端,可以直接编写代码向服务器端发起 HTTP 请求,并验证返回结果;它的语法非常简洁,是一种专为测试 REST API 而设计的 DSL。使用 Rest-Assured 测试 REST API,就和真正的用户使用 REST API 一样,只不过 Rest-Assured 让这一切变得自动化了。

安装和使用

首先,读者需要访问 Rest-Assured 的官方网站下载最新版本的 Rest-Assured。写作此文时,作者使用的是 2.4.1,下载解压成功后,会发现软件包还包含了其他第三方依赖,这些都是运行期需要的类库,确保将它们都加入你的 classpath。

现在我们以豆瓣 API 为例,简单介绍一下 Rest-Assured 的使用方法。为此,我们需要安装一个 REST 客户端插件方便调试。如果使用 FireFox 浏览器,可安装 RESTClient 插件,安装成功后,在地址一栏输入:http://api.douban.com/v2/book/1220562,方法选择 GET,请求发送成功后,会返回如下 JSON 字符串:

清单 1. 豆瓣读书 API 返回结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
{
  "id":"1220562",
  "alt":"http:\/\/book.douban.com\/book\/1220562",
  "rating":{"max":10, "average":"7.0", "numRaters":282, "min":0},
  "author":[{"name":"片山恭一"}, {"name":"豫人"}],
  "alt_title":"",
  "image":"http:\/\/img1.douban.com\/spic\/s1747553.jpg",
  "title":"满月之夜白鲸现",
  "mobile_link":"http:\/\/m.douban.com\/book\/subject\/1220562\/",
  "summary":"那一年,是听莫扎特、钓鲈鱼和家庭破裂的一年。",
  "attrs":{
  "publisher":["青岛出版社"],
  "pubdate":["2005-01-01"],
  "author":["片山恭一", "豫人"],
  "price":["18.00 元"],
  "title":["满月之夜白鲸现"],
  "binding":["平装 (无盘)"],
  "translator":["豫人"],
  "pages":["180"]
  },
  "tags":[
  {"count":106, "name":"片山恭一"},
  {"count":50, "name":"日本"},
  {"count":42, "name":"日本文学"},
  {"count":30, "name":"满月之夜白鲸现"},
  {"count":28, "name":"小说"},
  {"count":10, "name":"爱情"},
  {"count":7, "name":"純愛"},
  {"count":6, "name":"外国文学"}
  ]
}

现在,我们使用 Rest-Assured 来编写一个简单的测试程序调用相同的 API:

清单 2. DouBanTest.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//import 要使用的类和方法
import com.jayway.restassured.RestAssured;
import static com.jayway.restassured.RestAssured.*;
import static com.jayway.restassured.matcher.RestAssuredMatchers.*;
import static org.hamcrest.Matchers.*;
 
public class DouBanTest
{
  @Before
public void setUP(){
  //指定 URL 和端口号
  RestAssured.baseURI = "http://api.douban.com/v2/book";
  RestAssured.port = 80;
  }
 
  @Test
  public void testGETBook()
  {
  get("/1220562").then().body("title", equalTo("满月之夜白鲸现"));
  }
 
}

上面这段测试调用了同样的 API,返回了同样的结果,然后检查其"title"属性是否为"满月之夜白鲸现"。对比上面的 JSON 字符串,我们知道该测试可以通过。Rest-Assured 默认访问的 URL 为 localhost,端口号为 8080,这是为了方便开发人员做测试。如果要访问互联网上的 API,需要指定基础 URL 和端口号,如上面的代码所示。

发送请求时,还可以指定参数,比如我们使用 Java8 作为关键字,调用豆瓣读书的查询 API,可得到有关 Java8 的图书:

清单 3. 带参数的请求
1
2
3
4
@Test
  public void testSearchBook(){
  given().param("q", "java8").when().get("/search").then().body("count", equalTo(2));
}

同理,用户还可以在发送请求时指定 header、cookie、content type 等选项:

清单 4. 指定 header、cookie、content type
1
2
3
given().cookie("name", "xx").when().get("/xxx").then().body();
given().header("name", "xx").when().get("/xxx").then().body();
given().contentType("application/json").when().get("/xxx").then().body();

解析 JSON

使用 Rest-Assured 测试 REST API,当请求的 JSON 字符串返回时,需要选取相应的字段进行验证,Rest-Assured 提供了各种灵活的方式来选择字段,本节将通过示例,对一些常用方式进行说明。

清单 5. 常用的 JSON 字段选取方式
1
2
3
4
5
6
7
8
9
10
11
get("/1220562").then()
//取顶级属性“title”
.body("title", equalTo("满月之夜白鲸现"))
//取下一层属性
.body("rating.max", equalTo(10))
//调用数组方法
.body("tags.size()", is(8))
//取数组第一个对象的“name”属性
.body("tags[0].name", equalTo("片山恭一"))
//判断数组元素
.body("author", hasItems("[日] 片山恭一"));

字段的选取方式符合 JSON 的习惯,上面的例程分别展示了如何选取多层属性、数组元素以及调用数组的方法。

Rest-Assured 不仅支持 JSON,也支持 XML,读者可参考文末的链接自行学习。

身份验证

系统的某些 API 只对注册用户开放,Rest-Assured 提供了相应的验证方法:

清单 6. 验证
1
2
3
given().auth().basic(username, password).when().get("/secured").then().statusCode(200);
given().auth().oauth(..);
given().auth().oauth2(..);

其他 HTTP 请求

Rest-Assured 支持所有的标准 HTTP 请求:GET、POST、PUT、DELETE、PATCH、HEAD、OPTION。编写测试代码时,只需要替换为相应的方法即可。

集成

大家可以看到,在编写 Rest-Assured 测试代码时,我们使用了 JUnit,这样可以方便的将其集成进构建脚本中。每当有新的代码提交,系统自动触发构建,成功部署启动服务器后,就可以自动运行使用 Rest-Assured 编写的单元测试,对 REST API 进行测试,从而实现了系统测试的自动化。

结束语

本文对 Rest-Assured 做了简单的介绍,并通过一些示例程序展示了它的用法。需要注意的是,Rest-Assured 的功能强大,本文只是选取了它的一个子集进行介绍,但这些已经足够编写丰富的测试代码,来测试 REST API 了。读者若想进一步学习 Rest-Assured,请参考文末的链接。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RestAssured是一个流行的Java自动化测试框架,用于编写和执行RESTful API测试。它可以通过简单的API来处理HTTP请求和响应,并且可以轻松地将请求和响应转换为可读性强的代码。RestAssured还可以使用Gherkin语言编写BDD测试,并且支持与JUnit和TestNG等测试框架集成。 使用RestAssured可以快速编写和执行HTTP请求,验证响应状态码、响应头、响应体等细节,并且可以使用各种验证方式进行验证,如JSON Schema验证、XPath验证、正则表达式验证等等。同时,RestAssured还支持多种HTTP身份验证方式,包括基本身份验证、摘要身份验证、OAuth等。 使用RestAssured编写自动化测试用例的步骤如下: 1. 引入RestAssured依赖。 2. 编写测试用例,包括HTTP请求和验证响应的代码。 3. 运行测试用例并查看测试结果。 下面是一个使用RestAssured编写的示例测试用例: ```java import io.restassured.RestAssured; import org.junit.Test; import static io.restassured.RestAssured.given; public class RestAssuredTest { @Test public void testGet() { // 发送GET请求 given() .get("https://jsonplaceholder.typicode.com/posts/1") // 验证响应状态码和响应体 .then() .statusCode(200) .body("title", equalTo("sunt aut facere repellat provident occaecati excepturi optio reprehenderit")); } } ``` 上面的示例测试用例发送了一个GET请求,验证了响应状态码和响应体。使用RestAssured,可以非常方便地编写和执行各种HTTP请求和自动化测试用例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值