我将一个对象放入会话中,然后在该场景的后一步中,我需要在 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 请求不会添加到链中,因此不会执行。
除了将各个属性放入会话之外,还有什么办法可以做到这一点吗?这是一个简化的示例。我放入会话中的对象比这复杂得多。
已在 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
)
}