以下代码按预期工作,对于每次迭代,将弹出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
答案 0 :(得分:1)
因为csv(...)
实际上是FeederBuilder,它被调用一次以生成在场景中使用的馈线。
答案 1 :(得分:0)
Gatling DSL定义了构建器-这些构建器在启动时仅执行一次,因此即使内联时,您也会获得供所有用户共享的供稿器,因为使用同一(且唯一)构建器来创建所有用户。
如果要让每个用户拥有自己的数据副本,则不能使用.feed方法,但可以获取所有记录并使用其他循环构造来遍历它们。
val records = csv("foo.csv").records
foreach(records, "record") {
exec(flattenMapIntoAttributes("${record}"))
}