oauth2.0 Gatling负载测试期间刷新承载令牌

oymdgrw7  于 2023-02-11  发布在  其他
关注(0)|答案(2)|浏览(110)

在3个小时的测试中,我如何每15分钟刷新一次gatling(scala编写)中的bearer(aouth2)令牌?
我可以获得令牌,但在该场景中不能每隔15分钟应用一次。

def getXYZ() = {
    exec(
      http("Get all xyz")
        .get("/xyz/v1/abc")
    )
  }

  val authTimeout = 20.seconds
  val safetyMargin = 5.seconds
  val executionTime = 2.hours

  val tokenTimeout: ChainBuilder = exec(session => session.set("timeout", authTimeout.fromNow))
  val printSession: ChainBuilder = exec { session => println(session)
    session
  }

  def refreshAccessToken(): ChainBuilder = {
    exec(tokenTimeout)
    doIf(session => {
      session("timeout").as[Deadline].timeLeft <= safetyMargin
    }) {
      exec(
        http("Refresh Access Token")
          .post(url)
          .formParam("grant_type", "client_credentials")
          .formParam("scope", scope)
          .header("Content-Type", "application/x-www-form-urlencoded")
          .header("Authorization", s"Basic $base64EncodedCredentials")
          .check(jsonPath("$.access_token").find.saveAs("accessToken"))
      )
        .exec(printSession)
    }
  }

  val scn = scenario("Scenario: Load Simulation With rampingUp Users")
    .exec(session => {
      val mytoken = session("accessToken")  // -->Trying the capture the token here
      println(mytoken.as[String])
      session
    })
    .exec(getXYZ())
    .pause(5)

setUp(
    scn.inject( ..... etc ...)
lb3vh1jj

lb3vh1jj1#

伪码(在Java中,自Gatling 3.7起支持):

// global mutable reference to a shared token
private volatile String token = null;

// first scenario refreshes the token
// must run with one single user 
ScenarioBuilder refresh = scenario("refresh")
.during(Duration.ofHours(3)).on(
  exec(http("refreshToken").get(???).check(saveToken))
  .exec(session ->
    {
      token = session.getString("token")
      return token;
    }
  ).pause(Duration.ofMinutes(15))
);

// second scenario uses the token,
// must start after the first one
ScenarioBuilder use = scenario("use")
  .exec(http("useToken").get(???).header("Bearer", session -> token))
smtd7mpg

smtd7mpg2#

嗨,@斯蒂芬·兰德尔,
我试过你的伪代码解决方案,发现了一些问题:
1.我看不出有什么办法可以在header方法中使用session(IntelliJ自动完成中没有)
1.当我定义这样的场景时,没有办法确保一个令牌在另一个之前执行

setUp(
      refreshToken.injectOpen(
        atOnceUsers(1)
      ).protocols(httpProtocolToken),
      doWhatever.injectOpen(
          rampUsers(handler.getUsers()).during(
              Duration.ofSeconds(handler.getRamp()))
      ).protocols(httpProtocol)
    )

1.当我将Auth头定义为

.header("Authorization", "Bearer " + token)

使用第一个方案语法刷新内标识(它可以工作,如果你在变量上设置了断点,它会被更新,但是),如果它被初始化为null,它就保持原样,不管怎样,事实上,如果你在那里设置了断点,它不会停止。我认为实现是场景是静态,除非您在ActionBuilder中调用会话(但如第1点所述,我无法这样做)
我想我走到死胡同了除非我得到一些提示,谢谢。

相关问题