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

Karate-Gatling能否将前置场景数据传递到性能场景并行执行所有数据集

结论

你的需求完全可以通过 Karate-Gatling 实现,核心思路是先在 Scala 侧执行一次获取产品 ID 的前置场景拿到全量 ID 列表,再为每个 ID 独立配置并发线程,最后组合所有负载同时触发。


实现步骤

1. 调整 Karate 特征文件

将两个场景拆分,把产品查询场景改造为支持入参的通用场景,示例(文件命名为product-test.feature):

# 前置场景:获取全量产品ID
Scenario: Get Product ID List
  Given url url
  When method GET
  Then status 200
  * def productIds = $[*].productID

# 性能测试场景:支持传入单个productId参数
Scenario: Product Scenario
  * def productId = __karate.get('productId')
  Given url baseUrl + productId
  When method GET
  Then status 200

2. 编写 Gatling 性能测试脚本

在 Scala 模拟文件中先执行前置场景拿 ID,再动态生成每个 ID 对应的负载配置,示例:

import com.intuit.karate.gatling.PreDef._
import io.gatling.core.Predef._
import scala.concurrent.duration._

class ProductPerformanceTest extends Simulation {

  // 执行1次前置场景,获取全量产品ID列表
  val getIdsScenario = scenario("Get Product IDs").exec(karateFeature("classpath:product-test.feature", "Get Product ID List"))
  val runResult = getIdsScenario.run(1).result
  val productIds = runResult.getSessionAttrs.get("productIds").asInstanceOf[java.util.List[String]]

  // 为每个产品ID生成独立的性能场景,每个场景配置10个并发线程
  val allLoadScenarios = productIds.map { id =>
    scenario(s"Test Product ID: $id")
      .exec(karateFeature("classpath:product-test.feature", "Product Scenario", Map("productId" -> id)))
      .inject(atOnceUsers(10)) // 每个ID同时启动10个线程
  }.toList

  // 组合所有场景同时触发执行
  setUp(
    allLoadScenarios: _*
  )
}

3. 补充说明

  • 示例中使用atOnceUsers(10)实现所有线程同时触发,如果需要梯度加压、固定持续负载等其他模式,可直接替换为Gatling支持的其他注入策略。
  • 前置获取ID的场景只会执行1次,不会因为多线程重复调用,符合常规性能测试的数据准备逻辑。
  • 如果不想编写Scala代码,也可以在Karate特征文件内使用callSingle全局执行一次获取ID的逻辑,再通过循环为每个ID生成测试步骤,灵活度稍低但也能满足需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 17:45:03