加特林 - 动态饲料选择

时间:2014-07-02 14:01:38

标签: gatling

以下是 NEED 要做的事情:

.feed("users.csv") // includes username, password, groupid
// login...
.duration(x) {
    feed( csv("${groupid}.csv").random )
    // interact with the application using the data in the second .csv file
}

但是,当然,csv()函数接受一个字符串,而不是一个EL表达式。我需要能够在场景执行中的适当时刻编写该字符串。

我能够构建字符串,如下所示:

.exec( session => {
    feed( csv( session.getAttribute("groupid") + ".csv" ).random )
    session
})

但不幸的是,以下高管看不到数据。对我来说,这看起来像某种范围问题。我猜测feed()表达式正在完成它应该做的事情,但因为它不是外链的一部分,所以它不会被放置在它所属的位置。我是否应该在会话对象中的某个对象上调用.feed以将其附加到正在进行的链中?

关于如何完成我的目标的任何指导?谢谢!

2 个答案:

答案 0 :(得分:3)

馈线与模拟同时进行实例化。除非您使用底层工具,否则不能将其推迟到Simulation运行时。

你有多少个“groupid”文件? 如果您只有其中一些,则可以使用Gatling 2当前快照中的doSwitch或嵌入式doIf块,如果您使用Gatling< = 2M3a运行。

.doSwitch("${groupid}") (
  "foo" -> feed(csv("foo.csv").random),
  "bar" -> feed(csv("bar.csv").random)
)

这可以概括为:

def groupIdFeed(groupId: String) = groupId -> feed(csv(groupId + ".csv").random)

.doSwitch("${groupid}") (
  groupIdFeed("foo"),
  groupIdFeed("bar")
)

答案 1 :(得分:3)

感谢Stephane提供了最终解决方案的信息。

以下是我为1.5.5做的工作:

object Data {

  var groupList : List[Int] = List( ... ) // long list of IDs

  def branchByGroup ( path: String ) : ChainBuilder = {
    var c = bootstrap
    groupList.foreach( x => {
      c = c.doIf( "${groupId}", x.toString() ) {
        feed( csv( path + "/" + x.toString() + ".csv" ).random )
      }
    })
    return c
  }

  def searchCriteria () : ChainBuilder = branchByGroup( "search" )
  def other() : ChainBuilder = branchByGroup( "other" )
}

然后,在我的场景中,我称之为:

def scn = scenario("My Scenario")
            .feed( credentialSource )
            .exec( Login.steps )
            .during( loopTime ) {
                Data.searchCriteria()
                .exec( Search.steps )

Data.searchCriteria的调用是将.doIf()调用注入链中。如果它不是块中的第一件事,我当然不得不将它包装在.exec()中。

作为旁注,有一个我必须弄明白的问题。注意说c = c.doIf的部分 - 函数需要返回链的END,而不是从开始。您不能通过将所有内容附加到链中的第一个链接来构建链!模拟DSL的功能需要这种调用和分配方法。

希望这可以帮助除了我之外的其他人。 :)