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

