Ash Raf
Ash Raf

Reputation: 129

How to Save a Response Body and Use It Throughout the Gatling Execution

I am using 2 API calls in my Gatling simulation. One API returns the authentication token for the second, so I need to call the token generation API call only once during the execution and use it's generated token for the second API throughout the execution. But this works only for the first cycle of execution and the token that I have saved is not getting used for the remaining executions.

object KeycloakToken extends CMS {
    def request(conf: ExecutionConfig): HttpRequestBuilder = {
      http("Get Auth token from Keycloak")
        .post(s"${conf.authUrl}/token")
        .body(StringBody(""" {
                            "realm": "realm",
                            "clientId": "clientId",
                            "clientSecret": "clientSecret",
                            "grantType": "urn:ietf:params:oauth:grant-type:token-exchange",
                            "userName" : "userName"
                             } """)).asJson
        .check(jsonPath("$.access_token").saveAs("token"))
    }
  }

  object getOffers extends CMS {
    def request(conf: ExecutionConfig): HttpRequestBuilder = {
      http("getOffers")
        .post(s"$context")
        .body(StringBody(""" Body """)).asJson
        .headers(headers)
        .header("Authorization", s => s"Bearer ${s.attributes("token")}")
        .check(jsonPath("$.data.offers.offers[0].id").exists)
    }
  }

execute.apply(
    scenario("service")
      .exec(session => session.set("counter" , myGlobalVar.getAndIncrement))
      .doIf(session => session("counter").validate[Int].map(i => i == 0)) {
        exec(KeycloakToken.request(conf))                                       //--call only once
      }
      .exec(getOffers.request(conf))
)

Upvotes: 2

Views: 2493

Answers (1)

James Warr
James Warr

Reputation: 2604

A gatling session object is unique to each user. So when you set your counter session variable as the first step of your scenario then use a doIf to only get the token if counter==0 only the first user to execute will ever try to get the token.

Since the session is unique to that user, none of the other users will have a value for token in their session object.

What you're trying to do seems to be a pretty common issue - make a single request to get some kind of data, then have that data shared among all the users. eg: here

Note that it looks like this kind of scenario will be easier once gatling 3.4

Upvotes: 1

Related Questions