jMeter未将变量应用于标题管理器

时间:2017-06-09 16:37:38

标签: json jmeter

我在Mac上使用Apache JMeter 3.2 r1790748。 我有setUp Thread Group进行身份验证调用。呼叫正常工作并输出令牌。现在,我需要将该令牌传递给HTTP Header Manager以进行我正在进行的所有通话。

首先,这是我的令牌json输出:

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

这是HTTP Header manager的样子:

1值:AuthorizationBearer ${access_token}

我的网络电话:

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)

如您所见,变量access_token未被设置调用中的值替换。

我尝试过的事情:

BeanShell PostProcessor:

我创建了这个脚本,它实际上正确解析并输出access_token

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

关于标题管理器为什么没有应用access_token结果的值?

的任何想法

谢谢!

2 个答案:

答案 0 :(得分:4)

由于您在setUp线程组中设置了一个变量,因此您无法在其他线程组中使用它,因为线程组不共享变量,只有属性

因此,为了通过身份验证,您需要将其另存为属性:

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

在此示例中,我使用名为access_token变量的值(已设置,但仅在setUp线程组中可用)来设置属性 name,可在线程组中使用。或者更改BeanShell后处理器,添加:

props.put("access_token", access_token); 

然后在另一个线程组中,使用__P__property函数检索它:

${__P(access_token)}

还要记住,HTTP头管理器在任何线程启动之前都会初始化,因此您也不能在那里使用变量。例如,检查this question

如果您仍然看到空值,我建议在两个线程组中添加Debug Sampler(同时启用JMeter属性和JMeter变量),并检查破坏的位置(保存或检索时)。

答案 1 :(得分:1)

根据JMeter用户手册的Functions and Variables章节

  

变量是线程的本地变量;属性对所有线程都是通用的,需要使用__P__property函数进行引用

因此,无法通过以下方式访问您在setUp线程组中定义的变量:

  • 同一个线程组中的其他线程
  • Thread Group之外的其他线程

所以我的推荐是:

  1. 切换到JMeter属性而不是Jmeter变量,JMeter属性对所有线程都是全局的,实际上是整个JVM实例
  2. 使用JSR223 PostProcessor语言切换到Groovy,而不是Beanshell PostProcessor,JSR223 Elements performance is much better,而且Groovy has built-in JSON support
  3. 所以:

    1. 获取access_token属性值并将其存储到相关属性的相关Groovy代码将是:

      props.put('access_token', new groovy.json.JsonSlurper().parse(prev.getResponseData()).access_token)
      
    2. 您可以将HTTP标头管理器中的值(或您需要的任何位置)引用为:

      ${__P(access_token,)}