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

