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

如何用Gatling(Kotlin)提取公共API测试步骤实现复用?

抽离Gatling公共API步骤实现复用

在Gatling Kotlin DSL中,你可以把公共请求步骤封装成可复用的ChainBuilder对象/方法,放到单独文件中,所有场景直接引用即可。以下是具体实现方案和示例:

1. 创建公共步骤模块

新建CommonSteps.kt文件,将登录、打开客户、登出这些公共逻辑封装成独立方法,每个方法返回ChainBuilder类型(Gatling中用于表示请求链的核心类型):

import io.gatling.javaapi.core.ChainBuilder
import io.gatling.javaapi.core.CoreDsl.*
import io.gatling.javaapi.http.HttpDsl.*

object CommonSteps {
    // 登录步骤:提取token存入session供后续请求使用
    val login: ChainBuilder = exec(
        http("登录请求")
            .post("/api/auth/login")
            .formParam("username", "${System.getProperty("test.username", "default_user")}")
            .formParam("password", "${System.getProperty("test.password", "default_pass")}")
            .check(jsonPath("$.data.token").saveAs("authToken"))
    )

    // 打开客户详情步骤:支持传入自定义客户ID,依赖session中的authToken
    fun openCustomer(customerId: String = "default_customer"): ChainBuilder = exec(
        http("打开客户详情")
            .get("/api/customers/${customerId}")
            .header("Authorization", "Bearer #{authToken}")
            .check(status().isEqualTo(200))
    )

    // 登出步骤
    val logout: ChainBuilder = exec(
        http("登出请求")
            .post("/api/auth/logout")
            .header("Authorization", "Bearer #{authToken}")
    )
}

关键细节

  • 用object单例存储公共步骤,避免重复创建实例
  • 支持参数传递(如openCustomer允许传入不同客户ID),适配不同场景需求
  • 登录后提取的authToken存入session,后续所有步骤可直接引用

2. 在场景脚本中引用公共步骤

每个场景脚本直接导入CommonSteps,组合公共步骤与专属测试逻辑即可:

示例1:订单创建场景

import io.gatling.javaapi.core.Simulation
import io.gatling.javaapi.core.CoreDsl.*
import io.gatling.javaapi.http.HttpDsl.*

class OrderCreationScenario : Simulation() {
    val httpProtocol = http.baseUrl("https://your-api-domain.com")

    val orderCreationScenario = scenario("订单创建场景")
        .exec(CommonSteps.login)
        .exec(CommonSteps.openCustomer("customer_001"))
        // 专属测试步骤:创建订单
        .exec(
            http("创建订单")
                .post("/api/orders")
                .header("Authorization", "Bearer #{authToken}")
                .body(StringBody("""{"customerId": "customer_001", "amount": 100}""")).asJson()
                .check(status().isEqualTo(201))
        )
        .exec(CommonSteps.logout)

    init {
        setUp(
            orderCreationScenario.injectOpen(rampUsers(50).during(60))
        ).protocols(httpProtocol)
    }
}

示例2:客户信息更新场景

import io.gatling.javaapi.core.Simulation
import io.gatling.javaapi.core.CoreDsl.*
import io.gatling.javaapi.http.HttpDsl.*

class CustomerUpdateScenario : Simulation() {
    val httpProtocol = http.baseUrl("https://your-api-domain.com")

    val customerUpdateScenario = scenario("客户信息更新场景")
        .exec(CommonSteps.login)
        .exec(CommonSteps.openCustomer("customer_002"))
        // 专属测试步骤:更新客户信息
        .exec(
            http("更新客户信息")
                .put("/api/customers/customer_002")
                .header("Authorization", "Bearer #{authToken}")
                .body(StringBody("""{"name": "Updated Name", "email": "updated@example.com"}""")).asJson()
                .check(status().isEqualTo(200))
        )
        .exec(CommonSteps.logout)

    init {
        setUp(
            customerUpdateScenario.injectOpen(rampUsers(30).during(45))
        ).protocols(httpProtocol)
    }
}

3. 维护优势

  • 公共API变更时,仅需修改CommonSteps.kt中的对应方法,所有场景自动同步更新
  • 可扩展公共逻辑,比如添加全局请求头设置、通用断言等
  • 参数化设计让公共步骤适配不同场景的动态需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 14:27:40