动态创建和设置场景

Dynamically create and setup scenarios

我想在 for 循环中动态创建和设置 gatling 场景以对网络服务进行负载测试。

因此我尝试了以下(缩写):

class RecordedSimulation extends Simulation {

  val httpProtocol = http
    .baseURL("http://127.0.0.1")

  val overallUsers = 1000

  val methods: Map[String, Double] = Map(
    "FindContact" -> 0.6,
    "FindAddress" -> 0.3,
    "FindNumber" -> 0.1
  )

  for ((methodname, probability) <- methods) {
    val scen = scenario(methodname)
      .exec(http(methodname)
        .get("/contactservice")
        .queryParam("method", methodname))

    setUp(scen.inject(constantUsersPerSec(overallUsers * probability) during (60 seconds))).protocols(httpProtocol)
  }
}

如果我尝试运行这个模拟没有任何反应:没有启动模拟,也没有出现错误。

所以我的问题是是否有可能动态创建和设置加特林场景。我是漏了什么还是做错了什么?


为什么我要动态地做呢?

好吧,我有很多非常相似的方法要测试,我想避免 copy/pasting 一遍又一遍地出现相同的情况。

我自己发现了问题。 This gist 让我走对了方向。

看来您只能调用setUp方法一次。所以我将我的场景放在 ArraySeq 中,并使用此 ArraySeq 作为参数调用 setUp

import scala.collection.mutable.ArraySeq
import io.gatling.core.structure.PopulationBuilder

class RecordedSimulation extends Simulation {

  val httpProtocol = http
    .baseURL("http://127.0.0.1")

  val overallUsers = 1000

  val methods: Map[String, Double] = Map(
    "FindContact" -> 0.6,
    "FindAddress" -> 0.3,
    "FindNumber" -> 0.1
  )

  def scnList() = {
    var scnList = new ArraySeq[PopulationBuilder](methods.size)
    var i = 0
    for ((methodname, probability) <- methods) {
      var scen = scenario(methodname)
        .exec(http(methodname)
          .get("/contactservice")
          .queryParam("method", methodname))
        .inject(constantUsersPerSec(overallUsers * probability) during (60 seconds) randomized)

      scnList(i) = scen
      i = i + 1
    }
    scnList
  }

  setUp(scnList: _*).protocols(httpProtocol)
}

注意:正如评论中所讨论的,ArraySeq 在最新版本的 Scala 中是抽象的。正如键盘记录器所建议的那样,请改用 Array