Ohhnews

分类导航

$ cd ..
DZone Java原文

使用 Java REST-Assured 框架进行 DELETE API 接口测试指南

#api测试#自动化测试#rest-assured#java#接口测试

API 测试在近年来变得越来越流行。由于它不涉及用户界面(UI),因此执行速度通常更快、更容易。这使得 API 测试成为验证端到端系统功能的首选方案。此外,将自动化 API 测试集成到 CI/CD 流水线中,可以使团队更快速地获得构建反馈。

在本教程中,我们将探讨 DELETE API 请求,并学习如何使用 Java 中的 Rest-Assured 进行自动化测试。我们将涵盖以下主题:

  • 什么是 DELETE 请求?
  • 如何使用 Rest-Assured Java 测试 DELETE API?

什么是 DELETE API 请求?

DELETE API 请求用于从服务器中删除特定资源。在大多数情况下,DELETE 请求不会返回响应体。

被删除的资源通过 URI 进行标识,一旦请求被处理,该资源将从服务器中永久移除。因此,DELETE 操作可能会产生副作用,例如从数据库中删除记录。在处理 DELETE 请求时,以下是一些重要的注意事项:

  • 使用 DELETE 请求删除的数据无法恢复,因此应谨慎处理。
  • 它不被视为一种安全的方法,因为它直接影响服务器数据,如果管理不当,可能会导致数据不一致。
  • 在实践中,DELETE 并不总是幂等的。例如,第一次 DELETE 调用可能会返回 204(无内容)状态码表示删除成功,而对同一资源进行后续调用时,可能会返回 404(未找到),因为该资源已不存在。

测试应用

在本教程中,我们将使用可免费获取的 RESTful e-commerce API,它提供了多个与订单管理相关的端点,支持创建、检索、更新和删除订单等操作。该应用可以通过 Docker 或 Node.js 在本地部署。

以下是 RESTful e-commerce 项目中 DELETE API 端点的示例。

DELETE /deleteOrder/{id}

[LOADING...]

此 API 需要一个 order_id 作为路径参数,以标识应从系统中删除的订单。此 DELETE 请求无需发送请求体。但是,出于安全考虑,请求头中必须包含有效的身份验证令牌。

API 执行成功后,指定的订单将从系统中移除,并返回 204(无内容)状态码。如果订单不存在,或者令牌缺失或无效,API 将返回相应的错误响应。

如何使用 REST-Assured Java 测试 DELETE API 请求

测试 DELETE API 对于维护应用程序的稳定性和可靠性非常重要。由于这些 API 负责从系统中删除数据,因此必须验证其行为,以避免意外的数据丢失和系统不一致。在本次演示中,我们将使用 REST-Assured Java 来测试 DELETE /deleteOrder/{id} 端点,该端点用于从系统中删除现有订单。

入门指南

建议先阅读之前的教程,以了解先决条件、设置和配置。

查看 什么是 API 测试 以了解如何高效地测试 API。

测试场景 1:删除有效订单

本次演示将使用以下测试场景来演示 DELETE API 请求的测试:

### 前提条件
- 系统中应存在一些有效的订单。

### 测试步骤:
1. 使用 DELETE 请求删除 order_id 为 "1" 的订单。
2. 验证响应返回的状态码是否为 204。

[LOADING...]

测试实现

要实现此测试场景,我们需要系统中存在有效订单。这些订单可以通过运行 POST /addOrder API 来注入。查看这篇教程了解如何测试 POST /addOrder API,其中讨论了生成请求负载的不同方法。此外,在发送 Delete API 请求之前,我们需要授权令牌。

此测试场景将分为两部分实现:

  1. 请求 POST /auth API 端点并从中提取令牌。
  2. 使用步骤 1 中生成的令牌请求 Delete /deleteOrder/{id} API 端点。

步骤 1:生成并提取令牌

让我们创建一个新的 Java 类 TestDeleteRequestExamples,并添加测试方法 testTokenGeneration()

$ java
public class TestDeleteRequestExamples {
    private String token;

    @Test
    public void testTokenGeneration () {
        String requestBody = """
            {
                "username": "admin",
                "password": "secretPass123"
            }""";
        token = given ().contentType (ContentType.JSON)
            .when ()
            .body (requestBody)
            .post ("http://localhost:3004/auth")
            .then ()
            .statusCode (201)
            .and ()
            .body ("token", notNullValue ())
            .extract ()
            .path ("token");
    }
    //..
}

testTokenGeneration() 测试方法向 /auth 端点发送 POST 请求,使用用户名和密码生成身份验证令牌。由于这是一个演示 API,登录凭据已硬编码并直接作为字符串使用。

在实际场景中,不应暴露凭据,而应使用环境变量访问。

它验证响应状态码是否为 201,并检查响应体中是否存在 token 字段。然后,它从响应中提取令牌并将其存储在 token 变量中,以便在后续 API 请求中使用。

步骤 2:测试删除订单 API

让我们创建一个新的测试方法 testDeleteOrder() 来实现删除订单的测试。

$ java
public class TestDeleteRequestExamples {
    private String token;
    int orderId = 1;

    @Test
    public void testDeleteOrder () {
        given ().header ("Authorization", token)
            .log ()
            .all ()
            .when ()
            .delete ("http://localhost:3004/deleteOrder/" + orderId)
            .then ()
            .log ()
            .all ()
            .statusCode (204);
    }
    //..
}

testDeleteOrder() 测试方法向 /deleteOrder/{id} 端点发送 DELETE 请求,并在请求头中传递身份验证令牌。

  • header(): header() 方法用于向请求添加 Authorization 标头。它确保 API 调用经过身份验证,仅允许有效用户执行删除操作。
  • token: token 变量保存了使用 testAuthorizationToken() 测试方法生成的身份验证令牌。
  • delete(): 此方法向 /deleteOrder/{id} 端点发送 DELETE 请求,指示服务器删除指定的订单 (1)。
  • statusCode(): 测试验证响应是否返回 204(无内容)状态码,表明请求成功且资源已被删除,且没有响应体。

测试场景 2:获取已删除的订单

此测试场景确保指定的资源已成功从系统中删除。

  1. 请求 GET /getOrder API,尝试检索 order_id 为 1 的订单。
  2. 验证响应是否返回 404 状态码。

测试实现

让我们在已编写删除 API 测试的现有测试类中创建一个新的测试方法 testFetchingDeletedOrder()

$ java
@Test
public void testFetchingDeletedOrder () {
    given ().when ()
        .queryParam ("id", orderId)
        .get ("http://localhost:3004/getOrder")
        .then ()
        .statusCode (404);
}

testFetchingDeletedOrder() 方法使用之前通过 DELETE /deleteOrder API 删除的同一个 order_id 向 GET /getOrder API 发送请求。此测试的断言验证返回的状态码是否为 404(未找到),以检查资源是否已被删除且不再在系统中可用。

查看这篇教程了解如何使用 REST-Assured Java 测试 GET API 请求。

尽管之前的删除测试场景中使用的断言已经确认数据已被删除,但通过获取已删除资源来测试的场景可以作为额外的验证,特别是在执行端到端 API 测试时。

查看这篇教程,其中提供了用于验证响应数据、状态码、标头等的综合断言示例列表。

测试执行

让我们创建一个 testng.xml 文件,并将所有用于顺序验证 DELETE API 请求的测试添加到其中。

$ xml

现在,所有三个测试都应该按顺序运行。第一个将生成令牌,第二个将删除 order_id 为 1 的订单,最后一个将尝试检索已删除的订单。

[LOADING...]

上面的截图显示测试已成功运行,DELETE API 按预期工作。

总结

DELETE API 请求用于从系统中删除资源。由于删除是 CRUD 操作的关键部分,因此彻底测试它以确保系统按预期运行非常重要。同时,请记住 DELETE 操作是不可逆的,因此应始终谨慎处理。从实践角度来看,一个好的方法是在执行 DELETE 请求后调用 GET API,以验证资源已成功从系统中移除。

接下来,学习如何使用 JSONExcelCSV 等文件通过 REST Assured 执行数据驱动测试。祝测试愉快!