Gatling http 请求未执行

问题描述 投票:0回答:1

我将一个对象放入会话中,然后在该场景的后一步中,我需要在 http 请求中使用该对象的属性。

Gattle 表达式语言不支持访问对象的属性,所以我想我可以手动从会话中提取对象,然后使用以下代码在http请求中提取我需要的属性。

      exec(session => {
        val project = session("item").as[Project]
        println(s"name = ${project.getName}, daysToComplete = ${project.getDaysToComplete}")
        http("Health Check")
          .get(s"/health")
          .queryParam("name", s"${project.getName}")
        session
      })

但是以这种方式构造,http 请求不会添加到链中,因此不会执行。

除了将各个属性放入会话之外,还有什么办法可以做到这一点吗?这是一个简化的示例。我放入会话中的对象比这复杂得多。

http session exec gatling
1个回答
0
投票

已在 Gattle 官方邮件列表上回复。

这不起作用,请阅读文档:https://docs.gadling.io/reference/script/core/scenario/#exec

Gattle DSL 组件是不可变的 ActionBuilder,必须完全链接起来,并且仅在启动时构建一次。结果是一个动作的工作流程链。这些构建器本身不做任何事情,它们不会触发任何副作用,它们只是定义。因此,在函数运行时创建这样的 DSL 组件是完全没有意义的。如果您希望在执行流程中使用条件路径,请使用适当的 DSL 组件(doIf、randomSwitch 等)

exec { session =>
  if (someSessionBasedCondition(session)) {
    // just create a builder that is immediately discarded, hence doesn't do anything
    // you should be using a doIf here
    http("Get Homepage").get("http://github.com/gatling/gatling")
  }
  session
}

你应该这样做:

foreach(components, "component") {
exec(
  http { session => 
     val component = session("component").as[ITestComponent]
      s"Upload Component ${component.getId}"
  }.post { session =>
    val component = session("component").as[ITestComponent]
    s"/component/$repoId/$assetId/${component.getId}/${component.getResourceVersionId}"
  }
  .bodyPart(RawFileBodyPart("resource", session => {
      val component = session("component").as[ITestComponent]
          component.getContent.getAbsolutePath()).contentType(component.getMediaType()).fileName(component.getContent.getName())).asMultipartForm
    }
)
}

是的,这非常复杂。它看起来如此臃肿的原因是因为您尝试使用 Java POJO(隐藏在接口后面),而不是使用 Scala 案例类。 如果您要使用 Scala 案例类,您可以使用 Ga特林表达式语言(它不支持通过反射 atm 访问 POJO)并执行以下操作:

foreach(components, "component") {
exec(
  http("Upload Component ${component.id}") 
  .post(s"/component/$repoId/$assetId/$${component.id}/$${component.resourceVersionId}")
  .bodyPart(
    RawFileBodyPart("resource", "${component.content.absolutePath}")
      .contentType("${component.content.mediaType}")
      .fileName("${component.content.name}")
   ).asMultipartForm
  )
}
© www.soinside.com 2019 - 2024. All rights reserved.