首页 > 解决方案 > Gatling2 未能正确使用用户会话

问题描述

我希望有人能指出我正确的方向!我尝试运行一个场景,该场景有几个步骤必须按顺序执行,每个步骤都具有相同的用户会话才能正常工作。下面的代码适用于一个用户,但如果我使用 2 个或更多用户则失败......我做错了什么?

 val headers = Map(
Constants.TENANT_HEADER -> tenant
)
val httpConf = http
.baseURL(baseUrl)
.headers(headers)

val scen = scenario("Default Order Process Perf Test")
.exec(OAuth.getOAuthToken(clientId))
.exec(session => OAuth.createAuthHHeader(session, clientId))
.exec(RegisterCustomer.registerCustomer(customerMail, customerPassword, 
  tenant))
.exec(SSO.doLogin(clientId, customerMail, customerPassword, tenant))
.exec(session => OAuth.upDateAuthToken(session, clientId))
.exec(session => 

UpdateCustomerBillingAddr.prepareBillingAddrRequestBody(session))
.exec(UpdateCustomerBillingAddr.updateCustomerBillingAddr(tenant))
.exec(RegisterSepa.startRegisterProcess(tenant))
.exec(session => RegisterSepa.prepareRegisterRequestBody(session))
.exec(RegisterSepa.doRegisterSepa(tenant))

setUp(
 scen
  .inject(atOnceUsers(2))
  .protocols(httpConf))

object OAuth {

private val OBJECT_MAPPER = new ObjectMapper()

def getOAuthToken(clientId: String) = {
val authCode = PropertyUtil.getAuthCode
val encryptedAuthCode = new 

Crypto().rsaServerKeyEncrypt(authCode)

http("oauthTokenRequest")
  .post("/oauth/token")
  .formParam("refresh_token", "")
  .formParam("code", encryptedAuthCode)
  .formParam("grant_type", "authorization_code")
  .formParam("client_id", clientId)
  .check(jsonPath("$").saveAs("oauthToken"))
  .check(status.is(200))
}

def createAuthHHeader(session: Session, clientId: String) = {
val tokenString = session.get("oauthToken").as[String]
val tokenDto = OBJECT_MAPPER.readValue(tokenString, 
classOf[TokenDto])
val session2 = session.set(Constants.TOKEN_DTO_KEY, tokenDto)

val authHeader = AuthCommons.createAuthHeader(tokenDto, 
clientId, new util.HashMap[String, String]())
session2.set(Constants.AUTH_HEADER_KEY, authHeader)
}

def upDateAuthToken(session: Session, clientId: String) = {
val ssoToken = session.get(Constants.SSO_TOKEN_KEY).as[String]
val oAuthDto = session.get(Constants.TOKEN_DTO_KEY).as[TokenDto]

val params = new util.HashMap[String, String]
params.put("sso_token", ssoToken)

val updatedAuthHeader = AuthCommons.createAuthHeader(oAuthDto, 
clientId, params)

session.set(Constants.AUTH_HEADER_KEY, updatedAuthHeader)
}
}

  def createAuthHHeader(session: Session, clientId: String) = {
val tokenString = session.get("oauthToken").as[String]
val tokenDto = OBJECT_MAPPER.readValue(tokenString, 
classOf[TokenDto])
val session2 = session.set(Constants.TOKEN_DTO_KEY, tokenDto)

val authHeader = AuthCommons.createAuthHeader(tokenDto, 
clientId, new util.HashMap[String, String]())
session2.set(Constants.AUTH_HEADER_KEY, authHeader)
}

所以我确实添加了两种无法按预期工作的方法。在第一部分中,我尝试通过 check(jsonPath("$").saveAs("oauthToken")) 获取令牌并存储在会话中,在第二个调用中,我尝试使用 val tokenString = session.get 读取该令牌("oauthToken").as[String] 失败,但表示会话中没有该密钥的条目...

标签: gatlingscala-gatling

解决方案


我已经复制了它并删除/模拟了任何丢失的代码引用,切换到我的一个应用程序 auth url,它似乎工作 - 至少 2 个第一步。

一件看起来很奇怪的事情是jsonPath("$").saveAs("oauthToken")将整个 json(不是单个字段)保存为属性,这真的是您想要做的吗?你确定它getOAuthToken工作正常吗?

你说它对 1 个用户有效,但对 2 个用户失败。没有更多错误吗?对于调试,我建议在第二步之前将日志级别更改为TRACE或添加,以验证令牌是否正确保存到会话中。exec(session => {println(session); session})我认为授权请求(或构建该请求)有问题,并且以某种方式失败或引发了一些异常。我会注释掉除第一个步骤之外的所有步骤,并专注于检查第一个请求是否正确执行以及它是否为会话添加了正确的属性。


推荐阅读