Gatling2 未能正确使用用户会话

Gatling2 Failing to use user session properly

我希望有人能指出我正确的方向! 我尝试 运行 一个场景,其中有几个步骤必须按顺序执行,并且每个步骤都具有相同的用户会话才能正常工作。下面的代码适用于一个用户,但如果我使用 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] 失败,异常说明会话中没有该键的条目...

我认为你的括号设置不正确。将它们更改为:

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

我已经复制它并且 removed/mocked 任何遗漏的代码引用,切换到我的一个应用程序 auth url 并且它似乎工作 - 至少 2 个第一步。

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

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