Gatling2无法正确使用用户会话

时间:2018-06-15 18:39:28

标签: gatling scala-gatling

我希望有人能指出我正确的方向! 我尝试运行一个场景,其中包含几个必须按顺序执行的步骤,每个场景都有相同的用户会话才能正常工作。以下代码适用于一个用户,但如果我使用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)
}

所以我确实添加了两种不能按预期工作的方法。在第一部分中,我尝试通过检查获取一个令牌并存储在会话中(jsonPath(“$”)。saveAs(“oauthToken”))并在第二次调用中尝试使用val tokenString = session.get读取该令牌(“oauthToken”)。作为[String]失败,异常表示会话中没有该键的条目......

2 个答案:

答案 0 :(得分:1)

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

有一点似乎很奇怪的是jsonPath("$").saveAs("oauthToken")将整个json(不是单个字段)保存为属性,它真的是你想要做的吗?你确定getOAuthToken工作正常吗?

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

答案 1 :(得分:0)

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

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