使用加特林饲养者

时间:2014-12-09 14:53:17

标签: scala gatling

我正在尝试使用两个gatling馈线来生成http post请求数据:

第一个文件包含一些字段。其中一个是柜台。有了这个值,我想添加到我的帖子主体到第二个馈线的行。

例如:

fileA.csv
---------
fileAId,counter
value,3

fileB.csv
---------
fileBId
stack
overflow

我想构造这个字符串:“value stack overflow stack”。

我创建了一个场景:

object Actions {
    val search = forever() {
        group("Test") {
            exec(feed(FeederUtils.fileAFeeder))
            .exec(  
                http("Test")                                            
                    .post(uri)                          
                    .body(StringBody("""${fileAId} """ +     FeederUtils.generateItems(${counter}.toInt)))
                )
                .pause(20 seconds)
            }
        }
}   

一个对象FeederUtils:

object FeederUtils {
    val fileAFeeder= csv("fileA.csv").circular

    var fileBFeeder = csv("fileB.csv").circular

    def generateItems(itemsNumber: Int) : String = {
        var i = 0;
        var returnedString = "";
        for(i <- 0 to itemsNumber) {
            exec(feed(fileBFeeder))
            returnedString = returnedString + """${fileBId} """
        }

        return returnedString ;
    }
}

我有两个问题:函数调用没有编译(找不到:值$)而且generateItems中不存在馈送器变量。

我是Gatling&amp;的新手。 Scala所以我认为这很明显,但我不明白exec和feed函数是如何工作的。

谢谢!

编辑:功能代码如下:

object FeederUtils {
    val fileAFeeder= csv("fileA.csv").circular

    var fileBVector = csv("fileB.csv").records

    var fileBIterator = 0;

    def generateItems(itemsNumber: Int) : String = {
        var i = 0;
        var returnedString = "";
        for(i <- 0 to itemsNumber) {
            var currentItem = fileBVector(fileBIterator)

            //Circular read
            if (fileBIterator < fileBVector.size) { 
              fileBIterator+=1
            } else {
              fileBIterator=0
            }

            returnedString = returnedString + currentItem("fileBId")
        }

        return returnedString ;
   }
}

object Actions {
    val search = forever() {
        group("Test") {
            exec(feed(FeederUtils.fileAFeeder))
            .exec({session => session.set("generatedString",feederUtils.generateItems(session("counter").as[String].toInt))})
            .exec(  
                http("Test")                                            
                    .post(uri)                          
                    .body(StringBody("""${fileAId} ${generatedString}"""))
                )
                .pause(20 seconds)
            }
        }
} 

以下概念是:feed函数将数据存储到会话属性中,可以从gatling EL表达式中获取,也可以使用Session API手动复制。我必须将两者结合起来。

链接:

Session API

EL Expressions

Session manipulation with exec

1 个答案:

答案 0 :(得分:1)

您不能将馈线用于第二个文件。充其量,您可以一次提取多个记录,但名称将被翻译(fileBId1,fileBId2 ...)。

使用Gatling csv解析器加载第二个文件内容,这样您就可以访问记录(记录字段)并将其存储到全局值中。

从第一个文件中提取。

然后写下exec(function)

  • 从会话中获取计数器
  • 生成一个随机偏移量(ThreadLocalRandom),如果你想要随机策略,或者你想要像循环策略那样增加的AtomicInteger。
  • 从第二个文件中获取记录(使用记录向量大小上的模数来获取正确的索引)
  • 计算您的最终字符串

请勿尝试在自定义代码中使用Gatling EL。请参阅doc