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

Gatling Scala跨双baseUrl的E2E性能测试:请求数据传递方案咨询

在Gatling Scala中实现跨多BaseUrl的E2E请求链

核心思路

不用拆分场景,在单个场景中使用通用Http协议,针对不同请求单独覆盖BaseUrl,这样所有请求共享同一个会话,前序请求的响应数据可以正常传递给后续请求。

具体实现步骤

1. 定义通用Http协议

先配置通用的Http参数(如请求头、超时等),全局BaseUrl可以设为其中一个常用值(后续会被请求级配置覆盖):

import io.gatling.core.Predef._
import io.gatling.http.Predef._

val httpProtocol = http
  .acceptHeader("application/json")
  .userAgentHeader("Gatling-E2E-Perf-Test")
  .connectTimeout(5000)
  .responseTimeout(10000)
  .baseUrl("https://your-base-url-1.com") // 全局默认BaseUrl

2. 定义BaseUrl常量

把两个BaseUrl和公共路径抽成常量,方便复用和维护:

val BASE_URL_1 = "https://your-base-url-1.com"
val BASE_URL_2 = "https://your-base-url-2.com"
val COMMON_PATH = "/someUrlPath"

3. 构建完整E2E场景

在同一个场景中依次定义所有请求,对需要切换BaseUrl的请求,用.baseUrl()方法单独指定,同时通过saveAs()保存响应数据,后续请求直接引用会话中的变量:

val e2eUserJourney = scenario("E2E Multi-BaseUrl Test")
  // Request1: 使用BASE_URL_1,保存会话ID
  .exec(http("Request1")
    .baseUrl(BASE_URL_1)
    .get(COMMON_PATH)
    .check(jsonPath("$.sessionId").saveAs("userSessionId")))

  // Request2: 使用BASE_URL_2,携带前序请求的会话ID
  .exec(http("Request2")
    .baseUrl(BASE_URL_2)
    .post(COMMON_PATH)
    .header("X-Session-ID", "${userSessionId}")
    .check(jsonPath("$.orderId").saveAs("currentOrderId")))

  // Request3: 回到BASE_URL_1,使用前序的orderId
  .exec(http("Request3")
    .baseUrl(BASE_URL_1)
    .get(s"${COMMON_PATH}/order-details")
    .queryParam("orderId", "${currentOrderId}"))

  // Request4: 继续使用BASE_URL_1
  .exec(http("Request4")
    .baseUrl(BASE_URL_1)
    .post(s"${COMMON_PATH}/confirm-order"))

  // Request5: 使用BASE_URL_1
  .exec(http("Request5")
    .baseUrl(BASE_URL_1)
    .get(s"${COMMON_PATH}/payment-status"))

  // Request6: 切换到BASE_URL_2,更新订单状态
  .exec(http("Request6")
    .baseUrl(BASE_URL_2)
    .put(s"${COMMON_PATH}/update-order")
    .header("X-Session-ID", "${userSessionId}")
    .formParam("orderId", "${currentOrderId}")
    .formParam("status", "completed"))

  // Request7-8: 按需补充,这里假设使用BASE_URL_1
  .exec(http("Request7")
    .baseUrl(BASE_URL_1)
    .get(s"${COMMON_PATH}/user-profile"))
  .exec(http("Request8")
    .baseUrl(BASE_URL_1)
    .post(s"${COMMON_PATH}/logout"))

  // Request9: 回到BASE_URL_1,做最终校验
  .exec(http("Request9")
    .baseUrl(BASE_URL_1)
    .get(s"${COMMON_PATH}/audit-log")
    .queryParam("sessionId", "${userSessionId}"))

4. 配置测试启动项

只需要绑定单个场景和通用Http协议,所有请求共享同一个会话:

setUp(
  e2eUserJourney.inject(
    atOnceUsers(1), // 可根据测试需求调整注入策略
    rampUsers(10) during (10 seconds)
  )
).protocols(httpProtocol)

关键优势

  • 会话共享:所有请求在同一个场景中,前序请求保存的变量(如userSessionId、currentOrderId)可直接被后续请求引用,解决数据传递问题。
  • 灵活切换BaseUrl:请求级的.baseUrl()配置会覆盖全局Http协议的BaseUrl,无需拆分场景或协议。
  • 代码复用:通用Http配置集中管理,无需在每个请求中重复定义。

可选优化

如果有多个请求使用同一个BaseUrl,可以封装成工具方法减少重复代码:

def baseUrl1Request(requestName: String, path: String) = http(requestName)
  .baseUrl(BASE_URL_1)
  .get(path)

// 场景中调用:
.exec(baseUrl1Request("Request3", s"${COMMON_PATH}/order-details")
  .queryParam("orderId", "${currentOrderId}"))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 10:41:36