执行 ChainBuilder 时访问 session 个值
Access session values while executing ChainBuilder
是否可以访问 session 值并仍然执行 ChainBuilder
object?目前我的代码设置方式,http 请求从未真正执行过,因为它只是返回 session。我需要 session 属性来构建具有所有这些 session 值的 header 参数。
val testTCSService = scenario("Some Scenario")
.doIf(session => session.contains("value")) {
exec(session => if(session.contains("otherValue")) session else session.markAsFailed)
.exitHereIfFailed
.exec{session => OtherClass.verifyHTTPCall(session("value").as[String], session("secondValue").as[String], session("thirdValue").as[String])
session}
}
def verifyHTTPCall(token: String, realmId: String, userId: String): ChainBuilder = {
exec(http("HTTP Call")
.post("Some URL")
.header("header_value", generateHeader(value, secondValue, thirdValue))
.check(status.is(200))
}
它不会那样工作,因为 Gatling 并不像您(基本上每个开始使用它的人)所想的那样工作。场景链构建器每次模拟只执行一次,它创建一系列操作,然后每个用户将其用作所有请求的模板之类的东西。所以你需要做的不是在session中创建ChainBuilder
,而是在ChainBuilder中从session中提取数据。在您的情况下,使用 Session.Expression[T]
会更容易(某些操作采用这种类型的参数,它是 Session => T
类型的函数,因此您的代码可能如下所示:
val testTCSService = scenario("Some Scenario")
.doIf(session => session.contains("value")) {
exec(session => if(session.contains("otherValue")) session else session.markAsFailed)
.exitHereIfFailed
.exec(verifyHTTPCall)
}
def generateHeader(a: String, b: String, c: String): String = ???
def verifyHTTPCall = http("HTTP Call")
.post("Some URL")
.header("header_value", session => generateHeader(session("value").as[String], session("secondValue").as[String], session("thirdValue").as[String]))
.check(status.is(200))
或更简单,传递整个会话而不是 3 个属性值,并去除冗余 doIf
(如果未设置值,则跳过整个场景,因此整个失败会话机制将不起作用):
def generateHeader(session: Session): String = {
//Extract values from session and build header
}
val testTCSService = scenario("Some Scenario")
.exec(session => if(session.contains("otherValue")) session else session.markAsFailed)
.exitHereIfFailed
.exec(http("HTTP Call")
.post("Some URL")
.header("header_value", session => generateHeader(session))
.check(status.is(200)))
是否可以访问 session 值并仍然执行 ChainBuilder
object?目前我的代码设置方式,http 请求从未真正执行过,因为它只是返回 session。我需要 session 属性来构建具有所有这些 session 值的 header 参数。
val testTCSService = scenario("Some Scenario")
.doIf(session => session.contains("value")) {
exec(session => if(session.contains("otherValue")) session else session.markAsFailed)
.exitHereIfFailed
.exec{session => OtherClass.verifyHTTPCall(session("value").as[String], session("secondValue").as[String], session("thirdValue").as[String])
session}
}
def verifyHTTPCall(token: String, realmId: String, userId: String): ChainBuilder = {
exec(http("HTTP Call")
.post("Some URL")
.header("header_value", generateHeader(value, secondValue, thirdValue))
.check(status.is(200))
}
它不会那样工作,因为 Gatling 并不像您(基本上每个开始使用它的人)所想的那样工作。场景链构建器每次模拟只执行一次,它创建一系列操作,然后每个用户将其用作所有请求的模板之类的东西。所以你需要做的不是在session中创建ChainBuilder
,而是在ChainBuilder中从session中提取数据。在您的情况下,使用 Session.Expression[T]
会更容易(某些操作采用这种类型的参数,它是 Session => T
类型的函数,因此您的代码可能如下所示:
val testTCSService = scenario("Some Scenario")
.doIf(session => session.contains("value")) {
exec(session => if(session.contains("otherValue")) session else session.markAsFailed)
.exitHereIfFailed
.exec(verifyHTTPCall)
}
def generateHeader(a: String, b: String, c: String): String = ???
def verifyHTTPCall = http("HTTP Call")
.post("Some URL")
.header("header_value", session => generateHeader(session("value").as[String], session("secondValue").as[String], session("thirdValue").as[String]))
.check(status.is(200))
或更简单,传递整个会话而不是 3 个属性值,并去除冗余 doIf
(如果未设置值,则跳过整个场景,因此整个失败会话机制将不起作用):
def generateHeader(session: Session): String = {
//Extract values from session and build header
}
val testTCSService = scenario("Some Scenario")
.exec(session => if(session.contains("otherValue")) session else session.markAsFailed)
.exitHereIfFailed
.exec(http("HTTP Call")
.post("Some URL")
.header("header_value", session => generateHeader(session))
.check(status.is(200)))