如何用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
相关产品推荐
相关产品推荐

