在3个小时的测试中,我如何每15分钟刷新一次gatling(scala编写)中的bearer(aouth2)令牌?
我可以获得令牌,但在该场景中不能每隔15分钟应用一次。
def getXYZ() = {
exec(
http("Get all xyz")
.get("/xyz/v1/abc")
)
}
val authTimeout = 20.seconds
val safetyMargin = 5.seconds
val executionTime = 2.hours
val tokenTimeout: ChainBuilder = exec(session => session.set("timeout", authTimeout.fromNow))
val printSession: ChainBuilder = exec { session => println(session)
session
}
def refreshAccessToken(): ChainBuilder = {
exec(tokenTimeout)
doIf(session => {
session("timeout").as[Deadline].timeLeft <= safetyMargin
}) {
exec(
http("Refresh Access Token")
.post(url)
.formParam("grant_type", "client_credentials")
.formParam("scope", scope)
.header("Content-Type", "application/x-www-form-urlencoded")
.header("Authorization", s"Basic $base64EncodedCredentials")
.check(jsonPath("$.access_token").find.saveAs("accessToken"))
)
.exec(printSession)
}
}
val scn = scenario("Scenario: Load Simulation With rampingUp Users")
.exec(session => {
val mytoken = session("accessToken") // -->Trying the capture the token here
println(mytoken.as[String])
session
})
.exec(getXYZ())
.pause(5)
setUp(
scn.inject( ..... etc ...)
2条答案
按热度按时间lb3vh1jj1#
伪码(在Java中,自Gatling 3.7起支持):
smtd7mpg2#
嗨,@斯蒂芬·兰德尔,
我试过你的伪代码解决方案,发现了一些问题:
1.我看不出有什么办法可以在header方法中使用session(IntelliJ自动完成中没有)
1.当我定义这样的场景时,没有办法确保一个令牌在另一个之前执行
1.当我将Auth头定义为
使用第一个方案语法刷新内标识(它可以工作,如果你在变量上设置了断点,它会被更新,但是),如果它被初始化为null,它就保持原样,不管怎样,事实上,如果你在那里设置了断点,它不会停止。我认为实现是场景是静态,除非您在ActionBuilder中调用会话(但如第1点所述,我无法这样做)
我想我走到死胡同了除非我得到一些提示,谢谢。