Scala 在Gatling中创建加权给料机

Scala 在Gatling中创建加权给料机,scala,gatling,Scala,Gatling,我有几个.csv文件,我想在Gatling中用于相同的数据。这些文件中的每一个都有一定数量的ID,我希望能够公平地访问这些ID。我不想把它们都放在同一个文件中,因为.csv文件是由SQL查询生成的,虽然一个文件中可能有很多ID,但另一个文件中只有几个ID。对我来说重要的是,我从我的每个文件中随机抽取一个样本,并有一种方法来指定分布 我发现了如何做到这一点,但在我的案例中应用它时遇到了困难。这是我到目前为止的代码。我尝试在会话中1打印出进纸器的值,2尝试在get请求中使用进纸器的值。两次尝试都失败

我有几个.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函数封装在额外的{}在我接受你的答案之前,我要确保这完全解决了我所有的问题,你的答案应该在下周。你不需要附上{},因为只有一个操作。