【问题标题】:Usage of gatling feeders加特林喂食器的使用
【发布时间】:2015-02-07 12:24:03
【问题描述】:

我正在尝试使用两个加特林馈线来生成 http 发布请求数据:

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

例如:

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

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

我要构造这个字符串:“值栈溢出栈”。

我创建了一个场景:

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 和 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

【问题讨论】:

    标签: scala gatling


    【解决方案1】:

    您不能为第二个文件使用进纸器。充其量,您可以一次提取多条记录,但名称将被翻译(fileBId1、fileBId2...)。

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

    从第一个文件馈送。

    然后写一个exec(function) 你:

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

    不要尝试在自定义代码中使用 Gatling EL。见doc

    【讨论】:

    • 非常感谢您的回复 :) 我在原始帖子中添加了功能代码(我真的不明白为什么我们不允许添加回复:总是编辑原始帖子会增加太多噪音和在我看来对线程阅读没有帮助。此外,我想添加对 cme​​ts 来说似乎太长的代码示例)。如果我是对的,我可以使用两个馈线,但前提是文件列名称不同?是否只有特定的使用范围?
    • 列标题定义属性名称,因此如果您从多个同名馈送器馈送,您最终将覆盖以前的值。
    猜你喜欢
    • 1970-01-01
    • 2014-10-22
    • 1970-01-01
    • 2021-07-09
    • 2017-03-21
    • 1970-01-01
    • 2012-07-02
    • 2020-02-02
    • 1970-01-01
    相关资源
    最近更新 更多