在gatling场景之间共享数据

时间:2015-01-29 14:54:44

标签: gatling

我有一个场景,在包含用户名和密码的CSV文件的帮助下,获取会话ID并使用saveAs保存它们。

我希望能够在以下场景中使用这些会话ID,这些场景执行一些需要会话ID的操作。此外,我还想将会话ID与其用户名相关联。

基本上,我正在尝试从其余操作中对登录操作(获取会话ID)进行顺序化。加特林有可能吗?如果是这样,我如何在场景之间传递数据?

1 个答案:

答案 0 :(得分:10)

我意识到这个问题已经过时了,但我在研究类似问题的同时遇到了它,并且认为我会分享我遇到的解决方案,以防其他人遇到类似的问题。我的情况并不完全相似,但我的问题的核心本质是在两个并行运行的场景之间传递数据,所以我希望答案在未来可能对其他场景有一些价值,即使它在技术上只回答原来的一半问题

以下setUp显示了两个场景如何一起运行的一般概念,其中第二个场景以延迟开始,以确保在场景1中生成数据:

setUp(
  scenario1.inject(constantUsersPerSecond(0.5) during (10 minutes)),
  scenario2.inject(nothingFor(3 minutes), constantUsersPerSecond(0.1) during (7 minutes))
).protocols(httpProtocol)

简单地合并这两种情况本来是可能的,但我将这两种情景定义在两个不同的类中由于它们的大小,因为这两种情景都包含一长串执行步骤,并且由于它们的事实需要与不同的注射曲线并行运行。方案2中所需的数据在方案1中生成并存储在其会话中。

为了将数据从一个场景传递到另一个场景,我创建了一个除了保持单个LinkedBlockingDeque项目之外什么都没做的对象。我决定采用这种集合类型,以便在运行高负载测试时能够避免任何并发问题。

import java.util.concurrent.LinkedBlockingDeque

object DequeHolder {
  val DataDeque = new LinkedBlockingDeque[String]()
}

在方案一中,我在每个成功循环结束时将值保存到此双端队列中:

val saveData = exec{ session =>
  DataDequeHolder.DataDeque.offerLast(session("data").as[String])
  session
}

val scenario1 = scenario("Scenario 1")
.exec(
  step1,
  step2,
  .....
  stepX,
  saveData
)

最后在场景二中,我创建了一个自定义进纸器,从LinkBlockingDeque中检索数据,并像使用任何其他进纸器一样使用此进纸器:

class DataFeeder extends Feeder[String] {
  override def hasNext: Boolean = DataDequeHolder.DataDeque.size() > 0
  override def next(): Map[String, String] = Map("data" -> DataDequeHolder.DataDeque.takeFirst())
}

val scenario2 = scenario("Scenario 2")
.feed(new DataFeeder())
.exec(
  step1,
  step2,
  .....
  stepX,
)

到目前为止,这已被证明是一种可靠的方法,可以跨两个场景传递数据,而不会遇到并发问题。然而值得注意的是,我没有以高负载运行它,因为我的后端系统运行一些非常繁重的操作,并且不打算与数千个并发用户一起运行。我不知道这对于高负载下的系统如何起作用。