从0到1掌握REST Assured:2025最新实战指南(含Kotlin/Scala示例)

从0到1掌握REST Assured:2025最新实战指南(含Kotlin/Scala示例)

【免费下载链接】rest-assured Java DSL for easy testing of REST services 【免费下载链接】rest-assured 项目地址: https://gitcode.com/gh_mirrors/re/rest-assured

你还在为REST API测试编写冗长复杂的代码吗?还在为不同语言的测试框架切换而烦恼吗?本文将带你从0到1掌握REST Assured,这个让Java领域API测试变得像动态语言一样简单的强大工具。读完本文,你将能够:

  • 快速搭建REST Assured测试环境
  • 编写简洁高效的API测试用例
  • 掌握JSON/XML响应验证技巧
  • 实现认证授权测试
  • 了解Kotlin和Scala的特色用法
  • 解决常见的API测试痛点

REST Assured

什么是REST Assured?

REST Assured是一个Java领域的DSL(领域特定语言),专为简化REST服务的测试和验证而设计。它的核心优势在于将动态语言(如Ruby和Groovy)的简洁优雅带入了Java生态系统,让开发者能够用最少的代码完成复杂的API测试。

"Testing and validation of 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." - README.md

REST Assured支持所有HTTP方法,包括GET、POST、PUT、DELETE等,能够轻松处理参数、 headers、cookies和请求体的验证。最新版本5.5.6带来了多项改进,包括移除了multipart处理中的过时构造函数,修复了RequestSpecificationImpl中的NPE问题,并升级了commons-lang3依赖。

快速开始:环境搭建

Maven依赖配置

要在项目中使用REST Assured,只需在pom.xml中添加以下依赖:

<dependency>
    <groupId>io.rest-assured</groupId>
    <artifactId>rest-assured</artifactId>
    <version>5.5.6</version>
    <scope>test</scope>
</dependency>

如果你使用Spring生态,还可以添加Spring MockMvc支持:

<dependency>
    <groupId>io.rest-assured</groupId>
    <artifactId>spring-mock-mvc</artifactId>
    <version>5.5.6</version>
    <scope>test</scope>
</dependency>

对于Kotlin开发者,推荐使用Kotlin扩展模块:

<dependency>
    <groupId>io.rest-assured</groupId>
    <artifactId>kotlin-extensions</artifactId>
    <version>5.5.6</version>
    <scope>test</scope>
</dependency>

Scala开发者则可以使用:

<dependency>
    <groupId>io.rest-assured</groupId>
    <artifactId>scala-support</artifactId>
    <version>5.5.6</version>
    <scope>test</scope>
</dependency>

REST Assured还提供了BOM(Bill of Materials)来统一管理版本:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>io.rest-assured</groupId>
            <artifactId>rest-assured-bom</artifactId>
            <version>5.5.6</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

核心功能与基础用法

发送请求与验证响应

REST Assured的核心优势在于其流畅的API设计,让测试代码具有极高的可读性。最基础的用法模式是:

given().
    [请求配置].
when().
    [发送请求].
then().
    [验证响应];

例如,发送GET请求并验证响应状态码:

given().
    param("key1", "value1").
    param("key2", "value2").
when().
    get("/api/resource").
then().
    statusCode(200).
    body("response.status", equalTo("success"));

JSON响应验证

REST Assured提供了强大的JSON响应验证能力,支持JSON Path表达式:

// 验证单个字段
get("/lotto").then().assertThat().body("lotto.lottoId", equalTo(5));

// 验证列表包含元素
get("/lotto").then().assertThat().body("lotto.winners.winnerId", hasItems(23, 54));

XML响应验证

对于XML响应,REST Assured支持XPath表达式:

given().
    params("firstName", "John", "lastName", "Doe").
when().
    post("/greetMe").
then().
    body(hasXPath("/greeting/firstName[text()='John']"));

认证与授权

REST Assured内置多种认证机制,包括Basic Auth:

given().auth().basic(username, password).
when().get("/secured").
then().statusCode(200);

以及OAuth、Digest等高级认证方式,满足不同安全需求。

2025年新特性解析

增强的CSRF保护支持

2025年的更新中,REST Assured大幅改进了CSRF(跨站请求伪造)保护支持。现在,当应用CSRF时,它会自动将GET请求返回的cookies转发到CSRF令牌,并应用于实际请求。这些cookies也会自动应用于CookieFilter(如果已配置)和SessionFilter(如果已配置)。

given().
    csrf("/login").
    formParam("name", "My New Name").
when().
    post("/users/123").
then().
    statusCode(200);

如果配置了CookieFilter,登录请求返回的cookies将自动存储在CookieFilter中并用于后续请求:

var cookieFilter = new CookieFilter();
given().filter(cookieFilter).csrf("/login").formParam("name", "My New Name").
when().post("/users/123").
then().statusCode(200);

given().filter(cookieFilter).
when().get("/users/123").
then().statusCode(200);

你还可以通过配置禁用此行为:

given().
    config(config().csrfConfig(csrfConfig().automaticallyApplyCookies(false))).
    csrf("/login").
when().
    ...

Kotlin扩展升级

Kotlin扩展模块已升级到使用Kotlin 2.2.1,提供了更符合Kotlin风格的API:

val message: String = Given {
    port(7000)
    header("Header", "Header")
    body("hello")
} When {
    put("/the/path")
} Then {
    statusCode(200)
    body("message", equalTo("Hello World"))
} Extract {
    path("message")
}

这种风格不仅更符合Kotlin开发者的习惯,还带来了两大优势:

  1. 所有失败的期望会同时报告
  2. IDE格式化代码不会破坏缩进

Scala 3支持

2025年的更新引入了"scala-extensions"模块,专门针对Scala 3提供支持:

@Test
def `extraction with rest assured scala extensions`: Unit =
    val message: String = Given(req =>
        req.port(7000)
        req.header("Header", "Header")
        req.body("hello")
    )
    .When(
        _.put("/the/path")
    )
    .Extract(
        _.path("message")
    )
assertThat(message).isEqualTo("Hello World")

Kotlin实战示例

下面是一个完整的Kotlin测试示例,使用了MockWebServer进行模拟:

class KotlinITest {
    lateinit var webServer: MockWebServer

    @Before
    fun `mock web server is started`() {
        webServer = MockWebServer()
        webServer.start()
        RestAssured.port = webServer.port
    }

    @After
    fun `shutdown webserver after each test`() {
        webServer.shutdown()
        RestAssured.reset()
    }

    @Test
    fun `kotlin extension can validate multiple expectations`() {
        // Given
        givenServerWillReturnJson(""" { "greeting" : "Hello World", "other" : "thing", "something" : "else" } """)

        // When
        When {
            get("/greeting")
        } Then {
            body("greeting", equalTo("Hello World"))
            body("other", equalTo("thing"))
            body("something", equalTo("else"))
        }
    }

    private fun givenServerWillReturnJson(jsonString: String) {
        val response = MockResponse()
        response.setBody(jsonString)
        response.setHeader("content-type", "application/json")
        webServer.enqueue(response)
    }
}

完整代码可参考:examples/kotlin-example/src/test/kotlin/io.restassured.kotlin/KotlinITest.kt

Scala实战示例

Scala开发者可以这样编写测试:

class ScalaITest {
  var webServer: MockWebServer = _

  @Before
  def `Mock web server is initialized`() {
    webServer = new MockWebServer()
    webServer.start()
  }

  @After
  def `Mock web server is shutdown`() {
    webServer.shutdown()
  }

  @Test
  def `trying out rest assured in scala with implicit conversion`() {
    val response = new MockResponse
    response.setBody( """ { "key" : "value" } """)
    response.setHeader("content-type", "application/json")
    webServer.enqueue(response)

    given().
            port(webServer.getPort).
    when().
            get("/greetJSON").
    Then().
            statusCode(200).
            body("key", equalTo("value"))
  }
}

完整代码可参考:examples/scala-example/src/test/scala/io.restassured.scala/ScalaITest.scala

最佳实践与常见问题

请求规范复用

对于重复的请求配置,可以使用RequestSpecBuilder创建可复用的规范:

RequestSpecification requestSpec = new RequestSpecBuilder().
    setBaseUri("https://api.example.com").
    addHeader("Content-Type", "application/json").
    addParam("apiKey", "your-api-key").
    build();

// 复用规范
given().spec(requestSpec).
when().get("/users").
then().statusCode(200);

同样,响应验证也可以通过ResponseSpecBuilder复用:

ResponseSpecification responseSpec = new ResponseSpecBuilder().
    expectStatusCode(200).
    expectContentType(ContentType.JSON).
    build();

given().
when().get("/users").
then().spec(responseSpec).body("size()", greaterThan(0));

处理大型响应

对于大型响应,REST Assured提供了流式处理能力,避免将整个响应加载到内存:

given().
when().get("/large-data").
then().body("records.size()", equalTo(1000));

常见问题与解决方案

  1. 中文乱码问题:确保请求头中正确设置字符集
given().contentType("application/json;charset=UTF-8").body(ChineseJson).when().post("/endpoint");
  1. SSL证书问题:测试环境可禁用证书验证
given().relaxedHTTPSValidation().when().get("https://untrusted-server");
  1. 超时设置:根据需要调整超时时间
given().config(RestAssured.config().httpClient(HttpClientConfig.httpClientConfig().setParam(CoreConnectionPNames.CONNECTION_TIMEOUT, 5000))).
when().get("/slow-endpoint");

学习资源与进阶阅读

官方文档与示例

核心模块

总结

REST Assured凭借其简洁的API设计、强大的验证能力和丰富的扩展支持,已成为Java生态系统中REST API测试的首选工具。2025年的更新进一步增强了其在现代应用测试中的适用性,特别是对Kotlin和Scala等JVM语言的支持。

无论是简单的状态码检查,还是复杂的JSON/XML响应验证,REST Assured都能让你的测试代码更加清晰、易读、易维护。通过本文介绍的核心功能和最佳实践,你应该能够快速上手并应用于实际项目中。

最后,不要忘记收藏本文,关注项目更新,并尝试将REST Assured应用到你的下一个API测试任务中!

提示:更多高级用法和最新特性,请定期查看changelog.txt和官方文档。

【免费下载链接】rest-assured Java DSL for easy testing of REST services 【免费下载链接】rest-assured 项目地址: https://gitcode.com/gh_mirrors/re/rest-assured

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值