You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否结合REST Docs、REST Assured与Kotlin Ktor生成Ktor接口文档?

绝对可以!Ktor后端也能实现类似Spring REST Docs的文档生成流程

你完全可以参照Spring REST Docs的思路,通过单元测试捕获JSON负载并生成Asciidoctor片段,再整合到手写文档中。下面是具体的实现方案:

核心思路对齐

和Spring REST Docs的逻辑一致,我们的流程是:

  • 编写单元测试模拟真实接口调用
  • 在测试中捕获请求/响应的JSON负载
  • 将负载格式化为标准的Asciidoctor代码片段
  • 把自动生成的片段插入到手动编写的主文档中

具体实现步骤

1. 配置Ktor测试环境

先用Ktor自带的TestApplicationEngine搭建测试环境,模拟接口请求并捕获响应内容。示例代码如下:

import io.ktor.server.testing.*
import io.ktor.http.*
import io.ktor.client.call.*
import io.ktor.client.request.get
import kotlin.test.Test

class ApiDocumentationTest {
    @Test
    fun `get user endpoint returns valid json response`() = testApplication {
        // 加载你的Ktor业务模块与路由配置
        application {
            configureRouting()
            configureSerialization()
        }

        // 创建测试客户端并发送请求
        val client = createClient { }
        val response = client.get("/api/users/1")
        
        // 验证响应状态合法性
        assert(response.status == HttpStatusCode.OK)
        
        // 提取响应的JSON字符串
        val responseJson = response.body<String>()
        
        // 调用工具函数保存为Asciidoctor片段
        saveAsAdocFragment(responseJson, "user-get-response.adoc")
    }
}

2. 封装Asciidoctor片段生成工具

写一个简单的工具函数,把JSON内容格式化为Asciidoctor代码块并保存到指定目录:

import java.io.File

fun saveAsAdocFragment(content: String, fileName: String) {
    val adocContent = """
[source,json]
----
$content
----
""".trimIndent()
    
    // 保存到文档片段目录,建议和手写文档放在同一层级
    File("src/docs/asciidoc/fragments/$fileName").writeText(adocContent)
}

3. 整合到手写文档

在你的主Asciidoctor文档(比如api-documentation.adoc)中,通过include指令插入自动生成的片段:

== 获取用户接口
该接口用于查询指定ID的用户详情信息

=== 请求说明
- 请求方式:GET
- 请求路径:/api/users/{id}
- 路径参数:id(用户唯一标识)

=== 响应示例
include::fragments/user-get-response.adoc[]

结合Rest Assured使用

如果你更习惯用Rest Assured编写测试用例,也可以在Ktor测试环境中集成它:

import io.restassured.RestAssured
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test

class RestAssuredApiDocTest {
    @BeforeEach
    fun setup() {
        // 配置Rest Assured指向Ktor测试引擎的端口
        RestAssured.baseURI = "http://localhost:8080"
        // 启动TestApplicationEngine并绑定端口(此处省略引擎启动的具体代码)
    }

    @Test
    fun `get user via rest assured`() {
        val responseJson = RestAssured.given()
            .pathParam("id", 1)
            .get("/api/users/{id}")
            .then()
            .statusCode(200)
            .extract()
            .body()
            .asString()
        
        saveAsAdocFragment(responseJson, "user-get-response-restassured.adoc")
    }
}

进阶优化建议

  • 为不同业务场景(成功响应、参数错误、权限不足等)编写单独的测试用例,生成对应的文档片段
  • 封装更通用的工具类,支持生成请求参数说明、响应字段注释等更多类型的Asciidoctor片段
  • 结合构建工具插件(比如Gradle的org.asciidoctor.jvm.convert),自动将adoc文档转换为HTML/PDF格式

内容的提问来源于stack exchange,提问作者nail

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:14:00