Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如果未设置会话变量,如何执行身份验证调用_Scala_Gatling - Fatal编程技术网

Scala 如果未设置会话变量,如何执行身份验证调用

Scala 如果未设置会话变量,如何执行身份验证调用,scala,gatling,Scala,Gatling,我正在尝试编写一些负载测试,进行身份验证调用,然后对场景中的每个调用使用相同的令牌 我很难让它检查令牌是否已设置,如果未设置,则调用获取令牌。否则设置令牌,然后执行调用 执行此检查的代码如下所示: val scn = scenario("Get All Events") .doIf(session => session("bearerToken").asOption[String].isEmpty) { exec(getAuth.getBearerToken)

我正在尝试编写一些负载测试,进行身份验证调用,然后对场景中的每个调用使用相同的令牌

我很难让它检查令牌是否已设置,如果未设置,则调用获取令牌。否则设置令牌,然后执行调用

执行此检查的代码如下所示:

val scn = scenario("Get All Events")

    .doIf(session => session("bearerToken").asOption[String].isEmpty) {
      exec(getAuth.getBearerToken)
    }
    .pause(2)
    .exec (http("Get Events")
      .get("v1/events")
      .header("x-request-id", "perf-test")
      .header("HttpLogRequestId", s"${BaseHelpers.getUUID}")
      .header("x-api-key", s"${BaseHelpers.getXAPIKey}")
      .header("Authorization", "Bearer ${bearerToken}")
      .check(status.is(200))
  )
val getBearerToken = exec(http("Get Authorization Token")
    .post(baseAuthURL + "v1/oauth2/token?grant_type=password&client_id=" + client_id + "&username=" + username + "&password=" + password)
    .basicAuth(client_id, client_secret)
    .header("x-request-id", "perf-test")
    .header("HttpLogRequestId", s"${BaseHelpers.getUUID}")
    .check(status.is(200))
    .check(jsonPath("$.id_token").saveAs("bearerToken"))
  )
当它调用以设置身份验证令牌时,如下所示:

val scn = scenario("Get All Events")

    .doIf(session => session("bearerToken").asOption[String].isEmpty) {
      exec(getAuth.getBearerToken)
    }
    .pause(2)
    .exec (http("Get Events")
      .get("v1/events")
      .header("x-request-id", "perf-test")
      .header("HttpLogRequestId", s"${BaseHelpers.getUUID}")
      .header("x-api-key", s"${BaseHelpers.getXAPIKey}")
      .header("Authorization", "Bearer ${bearerToken}")
      .check(status.is(200))
  )
val getBearerToken = exec(http("Get Authorization Token")
    .post(baseAuthURL + "v1/oauth2/token?grant_type=password&client_id=" + client_id + "&username=" + username + "&password=" + password)
    .basicAuth(client_id, client_secret)
    .header("x-request-id", "perf-test")
    .header("HttpLogRequestId", s"${BaseHelpers.getUUID}")
    .check(status.is(200))
    .check(jsonPath("$.id_token").saveAs("bearerToken"))
  )
对我来说,结果通常是两件事之一。要么它每次都会打这个电话,不知何故忽略了检查,要么它会错误地告诉我找不到钥匙


我尝试过几种不同的方法,但仍然没有成功。希望第二双眼睛可以指出我的错误所在。

会话对每个用户都是私有的-因此我希望您编写的场景总是执行doIf块

gatlingel也支持您的用例(并不是说它会改变您看到的结果)。你可以写

doIf("${bearerToken.exists()}") {...}

但更大的问题是,您希望您的模拟实现什么?正如您所描述的,您希望一个用户登录,然后同时调用“v1/events”。正如您所写的,您希望每个登录都有多个用户,然后拨打该电话。

感谢您的快速回答。你这么说很有道理,这就是它的工作原理。我确实有几种方法可以解决这个问题。如果一个授权“用户”一次又一次地到达端点,那么更合适的情况是许多用户到达端点。也许你可以给我一些指导,告诉我如何编写这些代码来实现这一点?要让用户登录,然后反复点击端点,你可以使用gatling的循环结构之一,如
repea
”或
doWhile
。但这不会让同一用户同时调用端点。如果您想要同一用户的并发性(这是一个奇怪的场景),您可以像上一个场景(最有可能的场景)中所描述的那样,有多个用户登录并点击端点,您可以有一个场景,在这个场景中,他们登录后进行api调用(这里不需要doIf)。然后将一个feeder与您所有的usersPerfect一起使用。这听起来像是给了我一些基本的东西,我需要把这些画出来。非常感谢,因为我知道这不是很标准。