TooManyEduardos
TooManyEduardos

Reputation: 4434

jMeter not applying variable to header manager

I'm using Apache JMeter 3.2 r1790748 on Mac. I have a setUp Thread Group making an authentication call. The call works and outputs the tokens correctly. Now I need to pass that token to the HTTP Header Manager for all the calls I'm making.

First of all, here's my token json output:

{
    "access_token": "aaaaaa555555555",
    "token_type": "Access",
    "user_id": "5555"
}

Here's what my HTTP Header manager looks like:

1 value: Authorization : Bearer ${access_token}

My network call:

GET https://my_server.com/some_path

GET data:

[no cookies]

Request Headers:
Connection: close
Authorization: Bearer ${access_token}
Host: my_server.com
User-Agent: Apache-HttpClient/4.5.3 (Java/1.8.0_91)

As you can see, the variable access_token is not being replaced with the value from the setup call.

What I've tried:

BeanShell PostProcessor:

I created this script, and it actually parses and outputs the access_token properly:

import org.apache.jmeter.protocol.http.control.Header;
import net.minidev.json.JSONObject;
import net.minidev.json.parser.JSONParser;


String jsonString = prev.getResponseDataAsString();
log.info("jsonString = " + jsonString);

JSONParser parser = new JSONParser(JSONParser.MODE_JSON_SIMPLE);
JSONObject json = (JSONObject) parser.parse(jsonString);

String access_token = json.getAsString("access_token");
log.info("access_token = " + access_token);
vars.put("access_token", access_token);

JSON Extractor:

Apply to: Main sample and sub-samples
Variable names: access_token
JSON Path expressions: access_token
Match No. (0 for Random): 1
Compute concatenation var (suffix _ALL): unchecked
Default Values: none

Any ideas as to why the header manager is not applying the value of the access_token result?

Thanks!

Upvotes: 2

Views: 14407

Answers (2)

Dmitri T
Dmitri T

Reputation: 168157

As per Functions and Variables chapter of the JMeter User Manual

Variables are local to a thread; properties are common to all threads, and need to be referenced using the __P or __property function

So the variable you define in the setUp Thread Group cannot be accessed by:

  • other threads in the same Thread Group
  • other threads outside the Thread Group

So my recommendations are:

  1. Switch to JMeter Properties instead of Jmeter Variables, JMeter Properties are global to all threads and in fact the whole JVM instance
  2. Switch to JSR223 PostProcessor with Groovy language instead of Beanshell PostProcessor, JSR223 Elements performance is much better, moreover Groovy has built-in JSON support.

So:

  1. The relevant Groovy code for getting access_token attribute value and storing it into the relevant property would be :

    props.put('access_token', new groovy.json.JsonSlurper().parse(prev.getResponseData()).access_token)
    
  2. You can refer the value in the HTTP Header Manager (or wherever you require) as:

    ${__P(access_token,)}
    

Upvotes: 3

timbre timbre
timbre timbre

Reputation: 13995

Since you set a variable in setUp Thread Group, you cannot use it in another thread groups, since thread groups don't share variables, only properties.

So in order to pass authentication, you need to save it as a property:

${__setProperty(access_token, ${access_token})};

In this example I am using value of variable named access_token (already set, but only available in setUp thread group) to set property with the same name, which will be available across thread groups. Or change BeanShell post-processor, add:

props.put("access_token", access_token); 

And then in the other thread group, you retrieve it using __P or __property function:

${__P(access_token)}

Also keep in mind that HTTP Header Manager initializes before any thread starts, so you can't use variables there for that reason too. Check this question for instance.

If you still see empty value, I recommend adding Debug Sampler (with both JMeter Properties and JMeter Variables enabled) in both thread groups, and checking where the breakage is (on saving or retrieving).

Upvotes: 6

Related Questions