Gatling 2如何测量DSL

时间:2015-02-03 22:11:44

标签: scala gatling

Gatling是一个很好的负载测试工具,但DSL让我感到困惑。问题是我已经有自定义请求和模型类,我想创建某种“桥”类来将现有类移植到DSL中。

以下是一个例子:

exec {
  val request = new GetIdRequest()
  request.setCountry("US")
  request // There is an implicit conversion
    .check(status.is(200), bodyString.saveAs("ids"))
}.exec {
  session => 
    val ids = new ObjectMapper().readValue(session("ids").as[String], classOf[IdList])
    val request = new GetObjectRequest()
    val request.setId(id(0))
    request // There is an implicit conversion
      .check(status.is(200), bodyString.saveAs("object"))
    session
}

隐式转化仅将request转换为http(...).get(url)...

这显然不起作用,

  1. 会话是不可变的,因此“对象”值不会保存到会话
  2. 第二个request中的
  3. exec未执行,因为它未直接传递到exec
  4. 那么我怎样才能达到预期的效果呢?有没有我可以采用的例子,或者我必须实现自己的ActionBuilder(我不想这样做,因为这就像编写另一个协议)?感谢

    更新1

    这是我提出的解决方案。

    我创建了这个翻译方法

    def createHttp(name: String, req: Session => HttpRequest): HttpRequestBuilder = {
      http(name)
        .get {
        session => req(session).getUri
      }
        .header("Content-Type", "application/json")
        .header("Authorization", {
        session =>
          val r = req(session)
          Authorization.create("GET", r.getUri, appId, appKey)
      })
    }
    

    然后我只需传入一个创建HttpRequest

    的函数

1 个答案:

答案 0 :(得分:0)

你不明白的是Gatling DSL组件是不可变的构建器,它们在加载Simulation时只被解析和链接一次,只有一次。

因此,你可以:

  • 既不在会话功能中构建请求
  • 也不手动传递已从Session
  • 解析的一些数据

所有这些都发生在运行时,即稍后。

你的第一个exec工作(即使我会建议反对一个可变设计),因为块内容是静态的,请求确实构建一次。

你的第二个exec实际上每次执行时都会创建一个新的请求构建器,但它只是被丢弃了。

如果你真的想编写自己的DSL,你必须接受Gatling的工作方式。您不能只使用已解决的值,例如setId,您也必须能够Expression

另请注意,保存整个响应主体并为每次执行创建新的ObjectMapper的方式既麻烦又低效。

您只需使用JsonPath检查即可获取您感兴趣的单个ID,然后使用Gatling EL将保存的值注入下一个请求。