gatling - 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] 失败,但表示会话中没有该密钥的条目...
解决方案
我已经复制了它并删除/模拟了任何丢失的代码引用,切换到我的一个应用程序 auth url,它似乎工作 - 至少 2 个第一步。
一件看起来很奇怪的事情是jsonPath("$").saveAs("oauthToken")
将整个 json(不是单个字段)保存为属性,这真的是您想要做的吗?你确定它getOAuthToken
工作正常吗?
你说它对 1 个用户有效,但对 2 个用户失败。没有更多错误吗?对于调试,我建议在第二步之前将日志级别更改为TRACE
或添加,以验证令牌是否正确保存到会话中。exec(session => {println(session); session})
我认为授权请求(或构建该请求)有问题,并且以某种方式失败或引发了一些异常。我会注释掉除第一个步骤之外的所有步骤,并专注于检查第一个请求是否正确执行以及它是否为会话添加了正确的属性。
推荐阅读
- docker - 操作已超时 --> 无法解析 Windows 容器中的名称
- scala - Akka Streams:如何用未来的结果更新一个字段
- python - 如何使用 python 从 mongodb 导出特定字段并将其保存到数据框中
- docker - Terraform:使用 docker 容器内的 systemd 单元文件将 JSON 文件作为环境变量值传递
- vb.net - 附加信息:UPDATE 语句中的语法错误
- python - 如何编写一个 Python 函数来计算一个字母在字符串中出现的次数?
- javascript - 我想从 openweathermap 加载数据,以便我可以显示它,但我得到 Uncaught RangeError: Maximum call stack size exceeded
- reactjs - React Hook Form OnSubmit 处理程序和验证
- android - 防止应用在导航栏上按下 Home 时返回 BootActivity
- ios - 守卫之后的代码被调用的时间比预期的要晚