当前位置: 首页 > 知识库问答 >
问题:

在加特林创建一个加权给料机

印曜灿
2023-03-14

我有几个. csv文件,我想在Gatling中用于相同的数据。这些文件中的每一个都有一定数量的ID,我希望可以公平地访问它们。我不想把它们都放在同一个文件中,因为. csv文件是由SQL查询生成的,虽然我在一个文件中可能有很多ID,但在另一个文件中我只有几个。对我来说重要的是,我从每个文件中都有一个随机样本和一种指定分布的方法。

我找到了一个如何执行此操作的示例,但在我的案例中应用它时遇到了困难。这是我到目前为止的代码。我尝试1)在会话中打印来自feeder的值,2)尝试在get请求中使用来自feeder的值。两次尝试都失败了,出现了各种错误,我在下面详细说明:

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)
}

这是当我尝试在会话中打印出进纸器值时得到的错误(如上面使用会话的代码(

[ERROR] [03/13/2015 10:22:38.221] [GatlingSystem-akka.actor.default-dispatcher-8] [akka://GatlingSystem/user/sessionHook-2] key not found: first                                                                              
java.util.NoSuchElementException: key not found: first                                                         
        at scala.collection.MapLike$class.default(MapLike.scala:228)                                                    at scala.collection.AbstractMap.default(Map.scala:59)                                                  
        at scala.collection.MapLike$class.apply(MapLike.scala:141)                                             
        at scala.collection.AbstractMap.apply(Map.scala:59)                                                    
        at io.gatling.core.session.SessionAttribute.as(Session.scala:40)                                       
        at FeederTest$$anonfun$2.apply(feeder_test.scala:81)                                                   
        at FeederTest$$anonfun$2.apply(feeder_test.scala:79)                                                   
        at io.gatling.core.action.SessionHook.executeOrFail(SessionHook.scala:35)                              
        at io.gatling.core.action.Failable$class.execute(Actions.scala:71)                                     
        at io.gatling.core.action.SessionHook.execute(SessionHook.scala:28)                                    
        at io.gatling.core.action.Action$$anonfun$receive$1.applyOrElse(Actions.scala:29)                      
        at scala.PartialFunction$OrElse.applyOrElse(PartialFunction.scala:171)                                 
        at akka.actor.Actor$class.aroundReceive(Actor.scala:465)                                               
        at io.gatling.core.akka.BaseActor.aroundReceive(BaseActor.scala:22)                                    
        at akka.actor.ActorCell.receiveMessage(ActorCell.scala:516)                                            
        at akka.actor.ActorCell.invoke(ActorCell.scala:487)                                                    
        at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:254)    
        at akka.dispatch.Mailbox.run(Mailbox.scala:221)                                                        
        at akka.dispatch.Mailbox.exec(Mailbox.scala:231)                                                       
        at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)                                
        at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)                    
        at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)                            
        at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)

我还尝试在会话中使用EL表达式${first}。{string}这是所有的代码。类似地,在上一篇中。get行我收到一个错误,说“没有定义名为'first'的属性”。

我目前使用的CSV文件只有两列,第一列和最后一列,如下所示:

sample1.csv:
first, last
george, bush
bill, clinton
barak, obama

sample2.csv:
first, last
super, man
aqua, man
bat, man

我用的是加特林2.1.4。


共有2个答案

昝成弘
2023-03-14

我从未使用过馈线,但从文档中,我看到了两个可能的问题:

  1. randFeed返回“foo”或“bar”,但您正在映射“file1”和“file2”,所以是否加载了任何内容?(文件中说,“如果没有选择开关,则开关被旁路。”)
华化
2023-03-14

doSwitch采用表达式[Any],这是会话的类型别名=

这正是你要做的。即使randFeed是def,它仍然不会返回函数,而是返回字符串。

由于您希望每次虚拟用户通过此步骤时都调用randFeed,因此必须将randFeed包装在函数中,即使您不使用会话输入参数。

doSwitch(_ => randFeed)

然后,您的randFeed既丑陋(无意冒犯)又低效(随机同步):

import scala.concurrent.forkjoin.ThreadLocalRandom
def randFeed(): String =
  ThreadLocalRandom.current().nextInt(2) match {
    case 0 => "file1"
    case 1 => "file2"
  }

 类似资料:
  • 我可以用这种喂食器 但是当我得到这样的文件时,我如何使用feeder来替换超文本传输协议路径、标题和帖子正文?

  • 我对加特林和斯卡拉都是新手。我有一个清单,记录我的价值观。我想稍后迭代该列表以测试get操作。我该怎么做。 我基本上希望feeder对列表中给定的数据不断重复。 我试着用下面的方式创建feeder。但这是个例外 有人能帮我从列表中创建一个feeder吗

  • 我的加特林版本是2.2.0,例如: 只是一个接受用户名并返回凭据字符串的函数。 如您所见,用户名存储在

  • 我试着用各种“Rest”和“atOnceUser”进行注射。我在留档上没有找到一个好的解决方案。 我的方法是使用本地计数器创建一个名为“getNextNumber()”的函数,以增加“atOnceUser”的数量,但该函数一开始只调用一次。 有什么想法吗? 我的代码:

  • Gatling解析Strings参数值并将它们转换为函数,这些函数将根据存储在会话中的数据计算结果,然后对其进行评估。 加特林文件 有没有办法在exec中手动执行此操作? 我有多个使用EL属性的请求体模板,发送的请求将因进纸器而异 我目前拥有的代码如下: 我希望没有办法评估嵌套的EL属性,但是有没有办法使用会话变量手动评估它?类似于 我在其他一些问题中看到过ELCompiler被引用,但不确定从哪

  • 我有一个包含JSON数组的JSON文件 测验json 我想针对endpoint测试JSON数组中的每个元素,以观察系统针对唯一有效负载的性能 目前我有 测试ervice.scala 我无法从作为JSON Gatling文档称JSON Feeder将数组的每个元素加载到一个记录集合中 https://gatling.io/docs/2.3/session/feeder/ 即: 并将正文设置为 问题是