当前位置: 首页 > 知识库问答 >
问题:

如何将一个简单的迭代循环变成Gatling中的进纸器?

梅飞龙
2023-03-14

为了在运行性能脚本之前用大量数据填充系统,我们理想的用例是使用Gatling。数据不需要不同,除了具有唯一的主ID。

object Object {

 val create = repeat(4, "n")
 {
 exec(http("Create Object") 
 .post("/our/api/objects")
 .body(ELFileBody("CreateObject_0001_request.txt"))
 .check(status.is(201)))
 }
}

val createObjects = scenario("ModularSimulation").exec(CreateObjects.create);

setUp(
 createObjects.inject(atOnceUsers(1))
).protocols(httpProtocol)

上面的示例可以通过更改repeat的值来创建任意数量的对象,但是在大范围(例如100000个对象)下,线性地这样做变得不切实际。所以我想做的是有一个共享的对象池,由100个用户创建。

当然,这就是喂食器的使用案例。而不是生成一个静态的。csv文件或使用Redis使用简单的迭代循环(例如0100000)似乎最简单。

我知道(从文档和其他问题中)Feeder是迭代器[Map[String,T]]的一个类型别名,所以我认为这应该非常简单——但我似乎找不到这个最基本情况的简单示例。

任何帮助都将不胜感激。

共有2个答案

吴靖
2023-03-14

很好的答案是Teliatko,当你需要一个基于有限馈线的无限馈线时,你也可以添加到阵列中。像这样的随机或循环:

val infiniteFeeder = (for (i <- 0 until 2) yield {
  Map("yourFiniteSessionKey" -> s"I'm finite $i")
}).toArray.random
傅安宁
2023-03-14

我不确定你想不想实现什么,但使用feeders很容易。假设您有:

import scala.util.Random

// An infinite feeder generating random strings 
// accessible under "yourInfiniteSessionKey" from session  
val infiniteFeeder = Iterator.continually(
  Map("yourInfinteSessionKey" -> Random.alphanumeric.take(20).mkString)
)

// A finite feeder (in sense of possible values) 
// accessible under "yourFiniteSessionKey" from session
// it contains just 2 values for illustration purposes
val finiteFeeder = (for (i <- 0 until 2) yield {
  Map("yourFiniteSessionKey" -> s"I'm finite $i")
})

// A fixed feeder (again in sense of possible values)
// accessible under "yourFixedSessionKey" from session
// again it contains just 2 values for illustration purposes
val fixedFeeder = Array(
  Map("yourFixedSessionKey" -> s"I'm fixed 1"),
  Map("yourFixedSessionKey" -> s"I'm fixed 2")
)

val scn = scenario("Feeding")
  .feed(infiniteFeeder)
  .feed(finiteFeeder)
  .feed(fixedFeeder)
  .exec(http("root")
  .get("/${yourInfinteSessionKey}/${yourFiniteSessionKey}/${yourFixedSessionKey}"))

只是为了举例,我们的场景从我们所有的馈送器中获取并使用值来针对“/”组成GET请求。

在这种情况下,fix edFeederArray[Map[String,_]finiteFeederIndexedSeq[Map[String,_]。如果有限馈源中的项目数与您的设置匹配,则可以运行该场景,例如:

setUp(
  scn.inject(atOnceUsers(2))
).protocols(httpConf)   

安装程序只有两个virual用户,因此它运行起来没有问题。当您的设置中有更多虚拟用户时,例如:

setUp(
  scn.inject(constantUsersPerSec(1) during(30.seconds)) // equals 30 virtual users
).protocols(httpConf)  

您将遇到有限/固定馈线的问题,Gatling将对此进行投诉,您的模拟将停止如下:

[error] java.lang.IllegalStateException: Feeder is now empty, stopping engine
[error]     at io.gatling.core.action.SingletonFeed.feed(SingletonFeed.scala:59)
[error]     at io.gatling.core.action.SingletonFeed$$anonfun$receive$1.applyOrElse(SingletonFeed.scala:28)
[error]     at akka.actor.Actor$class.aroundReceive(Actor.scala:467)

好消息是,您可以使用RecordSeqFeederBuilder的Gatling API方法使有限/固定馈线无限,例如:

// Now the feeder from fixed values is infinite
val fixedFeeder = Array(
  Map("yourFixedSessionKey" -> s"I'm fixed 1"),
  Map("yourFixedSessionKey" -> s"I'm fixed 2")
).circular // go back to the top of the array once the end is reached

您还可以在场景定义中直接使用此类API方法调用,并保持固定/有限馈线不变,如:

val scn = scenario("Feeding")
  .feed(infiniteFeeder)
  .feed(finiteFeeder.random) // now is finiteFeeder infinite
  .feed(fixedFeeder.circular) // fixedFeeder is infinite too
  .exec(http("root")

享受吧

 类似资料:
  • 我有一个CSV文件,其中有大约10K个条目(我的会话的请求有效负载)。我正在使用内置的CSV进纸器在我的请求中循环遍历所有这些条目。但是只执行与测试中的用户数相对应的请求数。我希望整个提要都被执行。 例如,如果我有10个用户,那么在运行时只获取CSV的前10条记录。 这是我的代码:

  • 如何在Gatling中创建一个简单的进纸器而不使用csv文件?我尝试了Gatling留档中的脚本。我在留档中看到了一个例子 我不明白上面的代码。 我尝试了一个带有使用csv文件的进纸器的脚本并成功执行。与其从csv文件中馈送数据,不如如何编写可以取定义值的进纸器。

  • 问题内容: 问题很简单。我的代码中有一个循环: 在此循环中,当我们处于第一次或最后一次迭代时,我想做出不同的反应。 这个怎么做? 问题答案: 您可以使用一个计数器:

  • 问题内容: 我想知道是否有任何内置方法可以继续进行python外循环中的下一次迭代。例如,考虑以下代码: 我希望此继续语句退出jj循环并转到ii循环中的下一项。我可以通过其他方式(通过设置标志变量)来实现此逻辑,但是有一种简单的方法可以做到这一点,还是像要求太多? 问题答案: 在一般情况下,当您有多个循环级别且对您不起作用时(因为您要继续上一个循环,而不是当前循环的右上循环),可以执行以下操作之一

  • 我将获取一个用户列表作为数组,对数据进行分页,并以表格的形式显示在视图中。 为了迭代数组,我使用 foreach 循环。但是我的前循环迭代不起作用。 这是一个示例数组,当我执行< code>print_r()时,我有< code>id、< code>email和< code>full_name字段,我想在视图中显示它们 这是我迭代数组的视图部分。结果存储在< code>$userList中。这个数

  • 我有以下Python生成器: 而且我想在Java中实现一个,它的行为有点像之前的生成器。我曾尝试使用两个内部迭代器,但它不起作用。 我该怎么修?