REST Assured API 测试教程
⚡ 智能摘要
REST Assured 将自身确立为一家 Java这是一个基于开源框架的库,旨在简化 REST API 自动化测试。该框架使质量工程师能够使用简洁的 BDD 风格语法,并无缝集成 Maven,来验证复杂的 JSON 响应、标头、状态码和响应时间。
什么是 Rest Assured?
放心 使您能够使用 Java 库测试 REST API,并与 Maven 很好地集成。它具有非常高效的匹配技术,因此断言您的预期结果也非常简单。无论 JSON 结构有多复杂,Rest Assured 都有方法从请求和响应的几乎每个部分获取数据。
对于测试社区来说,API 自动化测试仍然是新兴且小众的。JSON 的复杂性使得 API 测试尚未得到探索。但这并不会降低它在测试过程中的重要性。Rest Assured.io 框架使用核心 Java 基础知识使其变得非常简单,使其成为非常值得学习的东西。
为什么需要 Rest-Assured?
想象一下你打开你的 Google 在地图上查找你想去的地方。你会立即看到附近的餐厅、各大旅行服务商提供的出行方案,以及众多触手可及的选择。我们都知道这些并非总是如此。 Google 产品,那么如何? Google 能否成功显示它们?它使用了这些提供商公开的 API。现在,如果您被要求测试这种设置,即使在 UI 构建或开发之前,测试 API 也变得至关重要。使用不同的数据组合反复测试,使其成为自动化测试的绝佳案例。
以前,团队使用动态语言,例如 Groovy 并且使用 Ruby 来实现这一点,这极具挑战性。因此,功能测试人员并没有广泛探索 API 测试。
然而,借助 Rest Assured,如果具备基本的 API 知识,就可以轻松地对 API 进行自动化测试,并发送具有用户友好自定义功能的简单 HTTPS 请求。 Java它有助于理解 API 测试和集成测试。Rest Assured 为后端提供了强大的保障,使前端测试人员能够专注于 UI 和客户端操作。Rest Assured 是开源的,并且不断添加新的方法和库,使其成为 API 自动化的理想选择。
REST Assured 与 Postman:主要区别
REST Assured 和 Postman 验证 REST API 的方法有很多,但每种方法都适用于测试生命周期的不同阶段。选择合适的工具取决于团队技能、项目范围和集成需求。
| 方面 | 放心 | Postman |
|---|---|---|
| 类型 | Java 用于基于代码的自动化的库 | 支持脚本编写的基于 GUI 的 API 客户端 |
| 最佳用例 | 持续集成管道和回归测试套件 | 手动探索和快速 API 检查 |
| 技能要求 | 核心优势 Java 所需知识 | 极简编码;用途 Java脚本片段 |
| 报告仪表板 | 与整合 TestNG, JUnit以及《魅力》杂志 | 通过 Newman CLI 提供内置的运行摘要 |
许多团队使用 Postman 早期原型ping 一旦 API 连接成功,就切换到 REST Assured 以实现自动回归测试。tract 稳定下来。
如何设置 Rest Assured.io Eclipse
搭建 REST Assured 涉及三个核心依赖项: Java你需要安装一个集成开发环境(IDE)和 Maven。请按照以下步骤操作,以避免后续构建错误。
步骤 1) 安装 Java。参考这个 指南
步骤 2)下载 IDE 并开始: 蚀
步骤 3) 安装 Maven 并设置你的 eclipse。参考 开始.
安心设置
- 在你的 IDE 中创建一个 Maven 项目。我们使用的是 IntelliJ,但无论你使用什么 IDE,都会得到类似的结构。
- 打开您的 POM.xml 文件。
REST Assured Maven 工作区的项目结构
对于 Rest Assured.io:对于 Java 版本 < 9 用户:
将以下依赖项添加到您的 POM.xml:
<dependency> <groupId>io.rest-assured</groupId> <artifactId>json-path</artifactId> <version>4.2.0</version> <scope>test</scope> </dependency> <dependency> <groupId>io.rest-assured</groupId> <artifactId>xml-path</artifactId> <version>4.2.0</version> <scope>test</scope> </dependency> <dependency> <groupId>io.rest-assured</groupId> <artifactId>json-schema-validator</artifactId> <version>4.2.0</version> <scope>test</scope> </dependency>
对于 Rest Assured.io:对于 Java 版本 9 及以上用户:
<dependency> <groupId>io.rest-assured</groupId> <artifactId>rest-assured-all</artifactId> <version>4.2.0</version> <scope>test</scope> </dependency>
故障排除:
如果您看到错误信息,并且不确定依赖项是否已正确下载,请按照以下步骤操作:
- 执行 Maven 构建以导入所有依赖项。您可以在以下位置找到有关 Maven 设置的帮助: Guru99.
- 如果错误仍然存在,请先运行 Maven clean 命令,然后再运行 Maven install 命令。构建过程应该会顺利完成,不会出现任何错误。
- 在您的文件中添加以下导入语句 Java 分类并确认没有编译错误。
import io.restassured.RestAssured.*; import io.restassured.matcher.RestAssuredMatchers.*; import org.hamcrest.Matchers.*;
第一个简单的 Rest Assured 脚本
依赖项都已就位,现在你可以编写你的第一个脚本了。该框架遵循行为驱动开发 (BDD) 风格,代码读起来几乎和英语一样。
语法:
Rest Assured.io 的语法是该框架中最易读的部分,因为它非常符合 BDD 的理念,而且易于理解。
Given().
param("x", "y").
header("z", "w").
when().
Method().
Then().
statusCode(XXX).
body("x", "y", equalTo("z"));
说明:
| Code | 说明 |
|---|---|
| 给定() | `Given` 关键字允许您设置背景。您可以在此处传递请求头、查询参数、路径参数、请求体和 Cookie。如果请求中不需要这些项目,则可以选择不传递这些参数。 |
| 什么时候() | “when”关键字标记了场景的前提。例如,“when”你获取/发布/放入某些内容时,执行其他操作。 |
| 方法() | 将其替换为任何 CRUD 操作(get/post/put/delete)。 |
| 然后() | 断言和匹配条件写在这里。 |
现在你已经完成了设置并了解了一些语法知识,让我们来创建第一个简单的测试。如果这种结构对你来说看起来很陌生,没关系,随着你不断编写代码并理解每一行代码,你会逐渐掌握它的。
你要去拿什么?
打开浏览器并点击 – https://demo.guru99.com/V4/sinkministatement.php?CUSTOMER_ID=68195&PASSWORD=1234!&Account_No=1. 确保您看到如下所示的内容。
REST Assured 捕获到的示例 API 响应
如果您在尝试获取请求响应时浏览器出现错误:
- 请检查您使用的是 HTTPS 还是 HTTP。您的浏览器可能设置了阻止不安全网站的选项。
- 检查是否有代理或防火墙阻止浏览器打开网站。
*注意: – 这里没有使用任何请求头、请求体或 cookie。 URL而且,你是从 API 获取内容,而不是发布或更新任何现有内容。因此,这是一个 GET 请求。记住这一点,以便更好地理解我们的第一个测试。
测试目标:
该脚本的目标是在您的 IDE 控制台上打印与您通过 Rest Assured 在浏览器上收到的内容相同的输出。
让我们按照以下步骤进行编码:
获取响应主体
步骤1) 创建一个名为“myFirstRestAssuredClass”的类。
步骤2) 创建一个名为“getResponseBody”的方法。
步骤3) 类似于之前学习的 given、when 和 then 的结构,输入以下代码:
given()。-> 不需要标题,不需要查询或路径参数。
when(). -> 没有设置具体条件。
得到('https://demo.guru99.com/V4/sinkministatement.php?CUSTOMER_ID=68195&PASSWORD=1234!&Account_No=1'). -> 仅限 URL 需要提供。
然后()。-> 无需任何具体断言。
log().all() -> 获取所有响应后,记录响应、标头以及请求返回给您的所有内容。
public static void getResponseBody(){
given().when().get("https://demo.guru99.com/V4/sinkministatement.php?CUSTOMER_ID=68195&PASSWORD=1234!&Account_No=1").then().log()
.all();
}
现在请注意, URL 这段代码太长,可读性较差。仔细观察,你会发现使用了 3 个查询参数:
- 客户ID
- 密码
- 户口号码
Rest Assured 帮助我们分别传递每个部分(查询、路径、请求头参数),从而使代码更易读、更易于维护。此外,我们还可以根据需要对来自外部文件的数据进行参数化。
对于使用查询参数,我们回到语法的定义,并看到所有它们都作为给定的一部分传递。
public static void getResponseBody(){
given().queryParam("CUSTOMER_ID","68195")
.queryParam("PASSWORD","1234!")
.queryParam("Account_No","1")
.when().get("https://demo.guru99.com/V4/sinkministatement.php").then().log()
.body();
}
**请注意,我们使用了“body”而不是“all”;这有助于我们举例说明。trac仅回复正文。
输出:
获取响应状态码
接下来我们要编写的脚本是获取状态码并添加断言来验证它。
步骤1) 创建一个名为getResponseStatus()的方法。
步骤2) 使用与上面相同的请求结构。复制并粘贴。
步骤3) 不要记录日志,而是使用“getStatus”。CodeRest Assured 内置的获取状态码值的方法。
步骤4) 要断言状态码为 200,请使用关键字 `assertThat().status`。Code(预期的Code).
**笔记 - URL 为简化起见,此处使用了一个变量。 URL 包含整个 API 请求 URL.
public static void getResponseStatus(){
int statusCode= given().queryParam("CUSTOMER_ID","68195")
.queryParam("PASSWORD","1234!")
.queryParam("Account_No","1") .when().get("https://demo.guru99.com/V4/sinkministatement.php").getStatusCode();
System.out.println("The response status is "+statusCode);
given().when().get(url).then().assertThat().statusCode(200);
}
输出:
业务需求
自动化的基本规则之一是我们必须设置检查点,以便只有满足所有必需条件时测试才会继续。在 API 测试中,最基本的验证是检查请求的状态代码是否为 2XX 格式。
到目前为止的完整代码:
import java.util.ArrayList;
import static io.restassured.RestAssured.*;
import static java.util.concurrent.TimeUnit.MILLISECONDS;
public class myFirstRestAssuredClass {
final static String url="https://demo.guru99.com/V4/sinkministatement.php?CUSTOMER_ID=68195&PASSWORD=1234!&Account_No=1";
public static void main(String args[]) {
getResponseBody();
getResponseStatus();
; }
//This will fetch the response body as is and log it. given and when are optional here
public static void getResponseBody(){
given().when().get(url).then().log()
.all();
given().queryParam("CUSTOMER_ID","68195")
.queryParam("PASSWORD","1234!")
.queryParam("Account_No","1") .when().get("https://demo.guru99.com/V4/sinkministatement.php").then().log().body();
}
public static void getResponseStatus(){
int statusCode= given().queryParam("CUSTOMER_ID","68195")
.queryParam("PASSWORD","1234!")
.queryParam("Account_No","1")
.when().get("https://demo.guru99.com/V4/sinkministatement.php").getStatusCode();
System.out.println("The response status is "+statusCode);
given().when().get(url).then().assertThat().statusCode(200);
}
}
*注意:
- 在这种情况下,200 表示请求成功。有时,您可能需要请求失败,此时可以使用 4XX 或 5XX 状态码。尝试通过提供无效参数来更改状态码并进行检查。
- 当我们断言一个条件时,除非出现错误,否则控制台上不会打印任何内容。
用于获取响应不同部分的脚本
除了响应体和状态码之外,REST Assured 还通过链式调用公开标头、响应时间和内容类型。tractor 方法。关键词“ex”tract' 对于获取这些特定部分至关重要。
标题
Rest Assured 是一种非常简单的语言,获取标头也同样简单。方法名称为 headers()。与之前一样,我们将创建一个独立方法来执行相同操作。
public static void getResponseHeaders(){
System.out.println("The headers in the response "+
get(url).then().extract()
.headers());
}
请注意,这里省略了 `given().when()`,代码行直接从 `get()` 开始。这是因为在发出请求并获取响应之前,没有进行任何前提条件或验证。在这种情况下,使用 `given().when()` 是可选的。
输出:
业务需求:
通常情况下,您需要在后续请求中使用授权令牌或会话 cookie,这些详细信息大多作为响应标头返回。
响应时效
为了获取从后端或其他下游系统获取响应所需的时间,Rest Assured 提供了一种名为“timeIn”的方法,并使用合适的 timeUnit 来获取返回响应所需的时间。
public static void getResponseTime(){
System.out.println("The time taken to fetch the response "+get(url)
.timeIn(TimeUnit.MILLISECONDS) + " milliseconds");
}
输出:
业务需求:
测试 API 的一个非常重要的指标是响应时间,它衡量的是应用程序的性能。调用 API 所需的时间可能会因您的网络速度、API 当时的性能、服务器负载以及其他影响响应时间的因素而有所不同。
内容类型
您可以使用“contentType()”方法获取返回响应的内容类型。
public static void getResponseContentType(){
System.out.println("The content type of response "+
get(url).then().extract()
.contentType());
}
输出
业务需求:
有时,获取内容类型对于确保不存在任何跨域威胁的安全漏洞以及确认传递的内容符合 API 标准至关重要。
获取单个 JSON 元素
根据给出的答案,你需要计算总金额。你需要提取每个金额并将它们相加。
步骤:
步骤1) 金额字段位于键为“statements”的数组中,而该数组又位于键为“result”的列表中。
步骤2) Rest Assured 提供了一种使用“路径”访问 API 中值的机制。
步骤3) 获取金额的路径是“result.statements.AMOUNT”。可以把它想象成 XPath。 Selenium.
步骤4) 获取集合中的所有金额,然后遍历所有值以计算总和。
public static void getSpecificPartOfResponseBody(){
ArrayList<String> amounts = when().get(url).then().extract().path("result.statements.AMOUNT") ;
int sumOfAll=0;
for(String a:amounts){
System.out.println("The amount value fetched is "+a);
sumOfAll=sumOfAll+Integer.valueOf(a);
}
System.out.println("The total amount is "+sumOfAll);
}
注意:由于金额值为字符串数据类型,我们将其转换为整数进行求和。
输出:
REST 认证测试自动化的最佳实践
一旦掌握了基础知识,应用规范的模式就能确保随着 API 接口的扩展,你的测试套件始终保持可靠。以下实践有助于团队避免测试不稳定和维护开销。
- 集中基地 URL: 将基本 URI 和身份验证令牌存储在单个配置类或属性文件中。这样可以避免重复配置,并简化环境切换。
- 使用请求和响应规范: 构建可重用的 RequestSpecBuilder 和 ResponseSpecBuilder 对象。当许多测试共享公共标头或断言时,它们可以减少样板代码。
- 验证 JSON Schema: 将 REST Assured 与 json-schema-validator 模块结合使用以确认连接tract 完整性。模式检查可在破坏性变更到达下游用户之前将其捕获。
- 外部化测试数据: 将有效负载存储在 JSON 文件中,或使用来自的数据提供程序 TestNG硬编码的数据很快就会过时。
- 运行独立测试: 每个测试都应该自行建立和清理数据。依赖于测试顺序的测试套件在并行持续集成运行中可能会出现不可预测的失败。
- 有选择地捕获日志: 在稳定测试套件中使用 `log().ifError()`,在调试期间使用 `log().all()`。详细的日志会减慢 CI 流水线的速度,并掩盖真正的问题。
- 接入 CI/CD: 通过 Maven Surefire 或 Failsafe 触发 REST Assured 套件 JenkinsGitHub Actions 或 GitLab。每次提交都运行冒烟检查,并在夜间进行完整回归测试。
尽早养成这些习惯,可以将 API 自动化变成一项长期资产,而不是一个脆弱的瓶颈。



