🔥 交流讨论:欢迎加入我们一起学习!
🔥 资源分享:耗时200+小时精选的「软件测试」资料包
🔥 教程推荐:火遍全网的《软件测试》教程
📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
Rest-Assured 介绍
什么是 Rest-Assured ?
Rest-Assured 是一套由 Java 实现的轻量级的 REST API 测试框架,可以直接编写代码向服务器端发起 HTTP 请求,并验证返回结果。
看看官方是怎么说的:
-
Testing and validating REST services in Java is harder than in dynamic languages such as Ruby and Groovy. -
REST Assured brings the simplicity of using these languages into the Java domain. -
与动态语言(如 Ruby 或 Groovy)相比,使用 Java 测试和验证 REST 服务要困难得多。 -
RestAssured 则将这些语言的简单性带入了 Java 域。
优点:
- 简约的接口测试 DSL(Domain Specific Language,即领域特定语言。DSL 是高效简洁的领域语言,与通用语言相比能极大降级理解和使用难度,同时极大提高开发效率的语言),因此代码足够简洁,编写测试用例快。
- 顺序控制结构(最简单的结构莫过于此,执行这条语句然后执行下一条语句的形式)。
- 符合契约编程思想(如果前置条件满足的情况下调用函数,那么函数的执行将确立后置条件)。
- 支持 XML、JSON 的结构化解析。
- 支持 Xpath、Jsonpath、Gpath 等多种解析方式。
- 对 Spring 的支持较为全面。
![]()
什么是 REST API ?
REST API 就是符合 REST 的风格,要了解 REST API 首先需要弄清楚 REST 风格的具体含义。REST 的全称是 Representational State Transfer,中文是表述性状态转移。这个是什么意思等会再解释,先说明为什么会出现 REST,以及它对整个网络服务 API 发展的重要性。
在互联网服务刚刚起步的时候,网页大部分是静态的,用户与服务器之间的交互比较少,但是随着动态网页的发展,操作的种类也越来越繁复,接口冗余且复杂,开发难度大大提升,扩展困难,而且网络 traffic 的负担也增大了。
针对这些问题,2000 年一篇论文提出了 REST 这个设计理念。REST 的宗旨是从资源的角度来观察整个网络,分布在各处的资源由 URI 确定,而客户端的应用通过 URI 来获取资源的表征。REST 与平台、语言等均无关,但是目前仅有 HTTP 是 REST 的实现案例。
通常,RESTful 服务应具有以下属性和功能:
- Representations
- Messages
- URIs
- Uniform interface
- Stateless
- Links between resources
- Caching
1)Representations(表述性)
-
RESTful 服务的重点是资源以及如何提供对这些资源的访问。资源可以很容易地被视为 OOP 中的对象,资源也可以包含其他资源。在设计系统时,首先要确定资源并确定它们之间的相互关系。这类似于设计数据库的第一步:识别实体和关系。
-
一旦我们确定了我们的资源,我们需要的下一件事就是找到一种在我们的系统中表示这些资源的方法。我们可以使用任何格式来表示资源,因为 REST 不会对表示的格式施加限制。所以,千万不要以为 REST 风格的设计,就一定采用 JSON 进行数据交换,在 REST 中也可以使用 XML 存储和数据交换,这个没有强制规定。只不过,我们在工作中,看到的设计,绝大部分都是采用 JSON 格式来进行数据交换。
2)Messages(消息)
-
客户端和服务通过消息相互通信。 客户端向服务器发送请求,服务器回复响应。除实际数据外,这些消息还包含有关消息的一些元数据。
-
简单来说,一个消息包含以下部分:

3)URI(统一资源标识符)
4)Uniform interface(统一接口)
- 统一的接口就是,不管是浏览器还是移动 app,都是同一个接口请求。主要是 GET、POST、PUT、DELETE 这几个方法。
5)Stateless(无状态)
- RESTful 服务是无状态的,不会为任何客户端维护应用程序状态。请求不能依赖于过去的请求,并且服务会独立地处理每个请求。这个无状态通信是 REST 的一个设计原则。服务器除了当前请求之外,它不知道客户端什么状态,不会纪录和本次请求之外的其他数据。
6)Links between resources(资源之间的联系)
- 资源表示可以包含指向其他资源的链接,例如 HTML 页面包含指向其他页面的链接。服务返回的表示应该像网站一样驱动流程。当我们访问任何网站时,我们将看到一个索引页面。 单击其中一个链接并移至另一个页面,依此类推。所以,在设计之前,考虑好对象之间的关系很重要。
7)Caching(高速缓存)
-
缓存是存储生成的结果并使用存储的结果的概念,而不是在相同的请求在不久的将来到达时重复生成它们。这可以在客户端、服务器或它们之间的任何其他组件上完成,例如代理服务器。缓存是提高服务性能的好方法,但如果管理不当,可能会导致客户端被提供过时的结果。
-
缓存是可以通过 HTTP 中头部的 Cache-Control 这个字段来控制。
Rest-assured 快速入门
Rest-assured 接口测试步骤:
- 创建 maven 项目;
- 添加 Rest-assured、Junit 依赖;
- 编写用例;
- 添加断言;
- 调试。
1)Maven 依赖:
-
<!-- 引入 rest-assured 基础依赖 --> -
<dependency> -
<groupId>io.rest-assured</groupId> -
<artifactId>rest-assured</artifactId> -
<version>3.0.0</version> -
<scope>test</scope> -
</dependency> -
<!-- json、xml 类的报文需要另外引入依赖 --> -
<dependency> -
<groupId>io.rest-assured</groupId> -
<artifactId>json-schema-validator</artifactId> -
<version>4.1.2</version> -
<scope>test</scope> -
</dependency> -
<!-- 引入 junit5 --> -
<dependency> -
<groupId>org.junit.jupiter</groupId> -
<artifactId>junit-jupiter</artifactId> -
<version>5.8.2</version> -
<scope>test</scope> -
</dependency>
![]()
2)测试代码:
-
import io.restassured.http.ContentType; -
import org.junit.jupiter.api.Test; -
import java.util.HashMap; -
import static io.restassured.RestAssured.given; -
import static org.hamcrest.CoreMatchers.equalTo; -
import static org.hamcrest.CoreMatchers.hasItems; -
public class DemoTest { -
// 简单的get无参请求 -
@Test -
public void testGet() { -
// url:http://www.baidu.com -
// then():断言动作 -
// statusCode(200):断言响应状态码是否等于200 -
given().get("http://www.baidu.com/").then().statusCode(200); -
} -
// 打印log -
@Test -
public void testGetHtml(){ -
// log():打印日志信息 -
// log().all():打印所有日志信息 -
// 前后的log()分别表示请求和响应的日志信息 -
given().log().all().get("http://www.baidu.com/").then().log().all().statusCode(200); -
} -
// rest-assured 最期望的格式 -
@Test -
public void testMp3() { -
given(). // 一次网络请求所需要的条件都写在这里,如头信息、query参数 -
queryParam("wd", "mp3"). -
when(). // 触发条件 -
get("http://www.baidu.com/s"). -
then(). // 断言动作 -
log().all(). -
statusCode(200); -
} -
// post 请求 -
@Test -
public void testPostJson() { -
HashMap<String, Object> map = new HashMap<>(); -
map.put("username", "admin"); -
map.put("password", "admin"); -
given().log().all() -
contentType(ContentType.JSON). // 设置JSON格式 -
body(map). -
when(). -
post("http://localhost:8080/renren-fast/sys/login"). -
then(). -
statusCode(200). -
// 可有多个断言 -
body("user.uername", equalTo("admin")). // 是否等于 -
// 断言该报文中价格低于10的书籍title包含"Moby Dick"和"Sayings of the Century"这两个关键字 -
body("store.book.findAll { it.price < 10 }.title",hasItems("Sayings of the Century", "Moby Dick")); -
} -
}

1039

被折叠的 条评论
为什么被折叠?



