Gatling Feeders - 创建新实例

时间:2016-06-03 16:39:33

标签: scala gatling

以下代码按预期工作,对于每次迭代,将弹出valueFeed中的下一个值并将其写入output.csv文件

class TestSimulation extends Simulation {
  val valueFeed = csv("input.csv")

  val writer = {
    val fos = new java.io.FileOutputStream("output.csv")
    new java.io.PrintWriter(fos, true)
  }

  val scn = scenario("Test Sim")
    .repeat(2) {
      feed(valueFeed)
        .exec(session => {
          writer.println(session("value").as[String])
          session
        })
    }

  setUp(scn.inject(constantUsersPerSec(1) during (10 seconds)))
}

在Feed方法中内联Feed创建时,行为仍然完全相同

class TestSimulation extends Simulation {

  val writer = {
    val fos = new java.io.FileOutputStream("output.csv")
    new java.io.PrintWriter(fos, true)
  }

  val scn = scenario("Test Sim")
    .repeat(2) {
      feed(csv("input.csv"))
        .exec(session => {
          writer.println(session("value").as[String])
          session
        })
    }

  setUp(scn.inject(constantUsersPerSec(1) during (10 seconds)))
}

由于未提取Feed创建,因此我不希望每次迭代都使用相同的Feed,而是创建它自己的Feed实例。

为什么行为意味着使用相同的Feed并且输入文件中的第一个值并不总是写入输出?

示例输入文件(截断数据,使用更多行测试以防止空馈线异常):

value
1
2
3
4
5

2 个答案:

答案 0 :(得分:1)

因为csv(...)实际上是FeederBuilder,它被调用一次以生成在场景中使用的馈线。

答案 1 :(得分:0)

Gatling DSL定义了构建器-这些构建器在启动时仅执行一次,因此即使内联时,您也会获得供所有用户共享的供稿器,因为使用同一(且唯一)构建器来创建所有用户。

如果要让每个用户拥有自己的数据副本,则不能使用.feed方法,但可以获取所有记录并使用其他循环构造来遍历它们。

val records = csv("foo.csv").records

foreach(records, "record") {
  exec(flattenMapIntoAttributes("${record}"))
}