How can i store a value as global variable from an API response and pass it to another API as parameter in Cucumber feature file using REST assured



  • I am designing automation scripts on Cucumber BDD framework for REST APIs using Rest assured. I have one api which generates the "Token" and then there is an another api for order create which requires this "Token" in the authorisation parameter. Here is my feature file

    Feature: Create Order API
    

    @Background:
    Scenario Outline: Generate Access token With Valid Details
    Given Query param for request
    | grant_type |
    | client_credentials |
    Given Basic Auth keys for request "" and ""
    When Build request for baseurl "PAYPAL_BASE_URI" and endpoint "ENDPOINT_GET_AUTH_KEY"

    And Set global "access_token" in "token"

    And Perform "POST" request using
    Then status code is 200
    And  response contains "scope"
    Examples:
      | userName    | key |                                                                  
    

    | AWnCbuv9Bee0_6 | EMWowD696LqfznidhQ2RT_jZL2ys |

    Now response of above API is as follows.

    {
        "scope": "https://uri.pppaypal.com/services/invoicing https://uri.pppaypal.com/services/applications/webhooks",
        "access_token": "ALs1szFnv2TJ19Zf3vq",
        "token_type": "Bearer",
        "app_id": "APP-284543T",
        "expires_in": 311286,
        "nonce": "2022-05-31T03:41:41ZWs9dpOQ"
    }
    

    Now i need this "access_token" as in the "Create Order API" Authorisation parameter withe Bearer. the "Create Order API" feature file is below.

     Scenario: Verify create order api using valid auth
        Given Generate request
        And Build request for baseurl "PAYPAL_BASE_URI" and endpoint "ENDPOINT_CREATE_ORDER_API"
        And Set header values as
          | Content-Type     | Authorization                                                                                            |
          | application/json | Bearer  |
        When Perform "POST" request using "FILE_PATH_ORDER_JSON"
        Then status code is 201
    

    How can i set "access_token" in "token" as global variable from the feature file so that i can use it anywhere in this feature file using the following step?

    And Set global "access_token" in "token"
    


  • The feature files are meant to be used for describing your https://softwareengineering.stackexchange.com/a/134420/256527 , no low-level details of how your automation code works. See https://www.youtube.com/watch?v=JDD5EEJgpHU from Dave Farley to see the separation from Domain and Implementation Details.

    Now, back to the question, if you want to have a global state, you can simply have a https://www.baeldung.com/java-singleton that will hold this state.

    public final class TokenState {
    
    private static TokenState INSTANCE;
    private String token;
    
    private TokenState() { }
    
    public static ClassSingleton getInstance() {
        if(INSTANCE == null) {
            INSTANCE = new TokenState();
        }
        
        return INSTANCE;
    }
    
    public void setToken(String token) {
       this.token = token;
    }
    
    public void getToken() {
       return this.token;
    }
    

    }

    This way, whenever you want to mutate the global token, you can simply do TokenState.getInstance.setToken("blabla") or to retrieve the token you do TokenState.getInstance.getToken().

    Note: If you prefer, you can use https://github.com/peichhorn/lombok-pg/wiki/%40Singleton to simplify the implementation of the Singleton.




Suggested Topics

  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2