Scala 在Gatling中创建加权给料机
我有几个.csv文件,我想在Gatling中用于相同的数据。这些文件中的每一个都有一定数量的ID,我希望能够公平地访问这些ID。我不想把它们都放在同一个文件中,因为.csv文件是由SQL查询生成的,虽然一个文件中可能有很多ID,但另一个文件中只有几个ID。对我来说重要的是,我从我的每个文件中随机抽取一个样本,并有一种方法来指定分布 我发现了如何做到这一点,但在我的案例中应用它时遇到了困难。这是我到目前为止的代码。我尝试在会话中1打印出进纸器的值,2尝试在get请求中使用进纸器的值。两次尝试都失败了,出现了各种错误,我将在下面详细介绍:Scala 在Gatling中创建加权给料机,scala,gatling,Scala,Gatling,我有几个.csv文件,我想在Gatling中用于相同的数据。这些文件中的每一个都有一定数量的ID,我希望能够公平地访问这些ID。我不想把它们都放在同一个文件中,因为.csv文件是由SQL查询生成的,虽然一个文件中可能有很多ID,但另一个文件中只有几个ID。对我来说重要的是,我从我的每个文件中随机抽取一个样本,并有一种方法来指定分布 我发现了如何做到这一点,但在我的案例中应用它时遇到了困难。这是我到目前为止的代码。我尝试在会话中1打印出进纸器的值,2尝试在get请求中使用进纸器的值。两次尝试都失败
import scala.concurrent.duration._
import io.gatling.core.Predef._
import io.gatling.http.Predef._
import io.gatling.jdbc.Predef._
import util.Random
class FeederTest extends Simulation {
//headers...
val userCreds = csv("user_creds.csv")
val sample1 = csv("sample1.csv")
val sample2 = csv("sample2.csv")
def randFeed(): String = {
val foo = Random.nextInt(2)
var retval = ""
if (foo == 0) retval = "file1"
if (foo == 1) retval = "file2"
return retval
}
val scn = scenario("feeder test")
.repeat(1) {
feed(userCreds)
.doSwitch(randFeed)(
"file1" -> feed(sample1),
"file2" -> feed(sample2)
)
.exec(http("request - login")
.post("<URL>")
.headers(headers_login)
.formParam("email", "${username}")
.formParam("password", "<not telling>"))
.exec(session => {
println(session)
println(session("first").as[String])
session})
.exec(http("goto_url")
.get("<my url>/${first}"))
}
setUp(scn.inject(atOnceUsers(1))).protocols(httpProtocol)
}
我还尝试在会话中仅使用EL表达式${first}。这只需要打印出字符串${first}。类似地,在最后一个.get行中,我得到一个错误,说没有定义名为“first”的属性
我当前使用的CSV文件只有两列,第一列和最后一列,如下所示:
sample1.csv:
first, last
george, bush
bill, clinton
barak, obama
sample2.csv:
first, last
super, man
aqua, man
bat, man
我使用的是Gatling 2.1.4。我从未使用过馈线,但从文档中,我看到了两个可能的问题: randFeed返回foo或bar,但您正在映射file1和file2,所以是否加载了任何内容?表示如果未选择开关,则该开关被旁通。 我看到的示例没有显示使用sessionvarname访问fed数据,而是${varname}。
我从未使用过馈线,但从文档中,我看到了两个可能的问题: randFeed返回foo或bar,但您正在映射file1和file2,所以是否加载了任何内容?表示如果未选择开关,则该开关被旁通。 我看到的示例没有显示使用sessionvarname访问fed数据,而是${varname}。 doSwitch接受表达式[Any],它是会话=>Validation[Any]的类型别名。Gatling有一个隐式转换,它允许您传递一个静态值,请参阅 这正是你要做的。即使randFeed是def,它仍然不会返回函数,而是返回字符串 由于您希望每次虚拟用户通过此步骤时都调用randFeed,因此必须将randFeed包装在函数中,即使您不使用会话输入参数
doSwitch(_ => randFeed)
然后,您的randFeed既丑陋又没有攻击性,并且同步了低效的Random:
import scala.concurrent.forkjoin.ThreadLocalRandom
def randFeed(): String =
ThreadLocalRandom.current().nextInt(2) match {
case 0 => "file1"
case 1 => "file2"
}
doSwitch接受表达式[Any],它是会话=>Validation[Any]的类型别名。Gatling有一个隐式转换,它允许您传递一个静态值,请参阅
这正是你要做的。即使randFeed是def,它仍然不会返回函数,而是返回字符串
由于您希望每次虚拟用户通过此步骤时都调用randFeed,因此必须将randFeed包装在函数中,即使您不使用会话输入参数
doSwitch(_ => randFeed)
然后,您的randFeed既丑陋又没有攻击性,并且同步了低效的Random:
import scala.concurrent.forkjoin.ThreadLocalRandom
def randFeed(): String =
ThreadLocalRandom.current().nextInt(2) match {
case 0 => "file1"
case 1 => "file2"
}
这就是为什么我没有勇气离开我的IDE!我将把这个标记为不可接受的答案-对不起。我发现我这里有更多的问题,我不能再发帖了。randFeed中的foo,bar是一个剪贴错误,我已经修复了。至于使用${varname},每当我使用它时,它只打印出${first}。我不相信你可以在会话中使用EL表达式-我可能错了。我的观点是你根本不使用会话-示例没有显示正在使用它。我更新了问题,希望能更清楚地强调问题所在@宋楚瑜:我试过你的建议,但没有用。我在.doSwitch语句中调用feed方法的方式有问题,它阻止了变量的定义。这就是为什么我没有勇气将IDE抛在脑后!我将把这个标记为不可接受的答案-对不起。我发现我这里有更多的问题,我不能再发帖了。randFeed中的foo,bar是一个剪贴错误,我已经修复了。至于使用${varname},每当我使用它时,它只打印出${first}。我不相信你可以在会话中使用EL表达式-我可能错了。我的观点是你根本不使用会话-示例没有显示正在使用它。我更新了问题,希望能更清楚地强调问题所在@宋楚瑜:我试过你的建议,但没有用。我在.doSwitch语句中调用feed方法的方式有问题,它阻止了变量的定义。更正错误后,我意识到我仍然有一个问题,很抱歉标记不正确。看来我的问题是,要么您无法访问会话内部的feeder数据,要么我使用了错误的语法。当我调试会话输出时,我在那里看不到任何馈线数据。甚至可以通过在会话中打印来完成我想做的事情吗?我从来没有使用过馈线,但是从文档中,我看到了两个可能的问题-1。randFeed返回
foo或bar,但您正在映射file1和file2,所以是否加载了任何内容?2.我看到的feeder示例没有显示使用sessionvarname访问fed数据,而是${varname}。randFeed中的foo,bar是一个剪切粘贴错误,我已经修复了这个错误。至于使用${varname},每当我使用它时,它只打印出${first}。我不相信你可以在会话中使用EL表达式-我可能错了。在更正了拼写错误后,我意识到我仍然有一个问题,很抱歉错误的标记。看来我的问题是,要么您无法访问会话内部的feeder数据,要么我使用了错误的语法。当我调试会话输出时,我在那里看不到任何馈线数据。甚至可以通过在会话中打印来完成我想做的事情吗?我从来没有使用过馈线,但是从文档中,我看到了两个可能的问题-1。randFeed返回foo或bar,但您正在映射file1和file2,所以是否加载了任何内容?2.我看到的feeder示例没有显示使用sessionvarname访问fed数据,而是${varname}。randFeed中的foo,bar是一个剪切粘贴错误,我已经修复了这个错误。至于使用${varname},每当我使用它时,它只打印出${first}。我不相信你能在会议中使用EL表达-我可能错了。Stephane-非常感谢你回答我的问题。这对我有用。我必须为实现此功能的任何其他人做以下小修改:1导入scala.concurrent.forkjoin.ThreadLocalRandom 2将randFeed函数封装在额外的{}在我接受你的答案之前,我要确保这完全解决了我所有的问题,你的答案应该在下周。你不需要附上{},因为只有一个手术。Stephane-非常感谢你回答我的问题。这对我有用。我必须为实现此功能的任何其他人做以下小修改:1导入scala.concurrent.forkjoin.ThreadLocalRandom 2将randFeed函数封装在额外的{}在我接受你的答案之前,我要确保这完全解决了我所有的问题,你的答案应该在下周。你不需要附上{},因为只有一个操作。