4

这是我需要做的:

.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 以便将其附加到正在进行的链中?

关于如何完成我打算做的事情的任何指导?谢谢!

4

2 回答 2

4

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

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

.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")
)
于 2014-07-02T14:53:22.513 回答
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 的功能需要这种调用和分配方法。

希望这对我以外的其他人有所帮助。:)

于 2014-07-03T20:34:27.870 回答