scala 加特林:多次动态设置一个场景

gtlvzcf8  于 2022-11-09  发布在  Scala
关注(0)|答案(2)|浏览(152)

我有一个场景,其中有4个不同的API调用,它们总是保持不变。我正在尝试创建一个平行的压力测试,我希望相同的场景首先运行10%,然后运行20%、30%……最大用户数等。
我面临着一个问题,我无法多次设置相同的场景。

但我也需要设置是动态的,取决于脚本中的可配置变量这是导致问题的原因,我希望能够轻松配置它来运行,例如10%、50%和100%。

这就是我到目前为止所拥有的(缩写,在OnceUser和Nothingfor动态地从配置中获取输入,迭代bla(I))

def scnList() = {
    var scnList = new ArraySeq[PopulationBuilder](someArray.length)
    var i = 0
    for (i <- 0 until someArray.length) {
      var scen = myscenario
        .inject(atOnceUsers((bla(i)), nothingFor(blabla(i) minutes))
      scnList(i) = scen
    }
    scnList
}

setUp(scnList: _*).protocols(httpConf)
    .assertions(global.successfulRequests.percent.gt(99),
    forAll.responseTime.max.lt(5000)
)
mwg9r5ms

mwg9r5ms1#

每个模拟只能调用一次setUp,如果您将场景列表作为参数传递给它,那么它将并行运行它们,这在您的情况下是没有意义的。应该运行的是使用注入配置文件运行单个场景,该场景将一个接一个地运行几个不同负载级别的场景。可以从某个配置FE加载每次迭代的用户数。

val steps = Seq(5, 10, 15, 25, 40) // Contains users/s in each step, can be read from config

//Build list of injections based on sequence above
val injectionProfile = steps.flatMap(
  load => Seq(
    constantUsersPerSec(load).during(30 seconds),
    nothingFor(10 seconds)
  )
)

val httpConf = http.baseURL("http://google.com")

val myscenario = scenario("My scenario")
  .exec(
    http("Get example")
      .get("/")
      .check(status.is(200))
  )

setUp(
  myscenario.inject(injectionProfile).protocols(httpConf)
)

如果你想让每一次迭代都出现在单独的报表中,那么最好的方法就是创建抽象的模拟类和更多的类,用不同的构造函数参数来扩展它,但这样就很难得到可变数量的步骤,所以如果你愿意拥有固定数量的变量,那么可能是另一种方式。

9ceoxa92

9ceoxa922#

按顺序运行相同场景N次的示例代码。希望它能帮助一些人。

private def createUser(n: Int): ScenarioBuilder =
    scenario(s"Create User $n").exec(
      baseScenario,
      feed(newGatlingUserFeeder),
      exec(...),
      ...
    )

  private def sequentialInjection(times: Int, scenario: Int => ScenarioBuilder): PopulationBuilder =
    (1 until times).foldLeft(scenario(0).inject(atOnceUsers(1))) { case (previousScenario, i) =>
      previousScenario.andThen(scenario(i).inject(atOnceUsers(1)))
    }

  setUp(
    // Create 1000 users.
    sequentialInjection(1000, createUsers)
  )
    .protocols(httpProtocol)

此处使用n为每个步骤指定一个新名称,否则将收到错误java.lang.IllegalArgumentException: requirement failed: Scenario names must be unique but found duplicates。操作员可以对此进行调整,以使用加载百分比。
Mateusz的解决方案不起作用;所有场景都将并行运行。

相关问题