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

Too*_*dos 1 json jmeter

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

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

{
    "access_token": "aaaaaa555555555",
    "token_type": "Access",
    "user_id": "5555"
}
Run Code Online (Sandbox Code Playgroud)

这是我的HTTP Header manager样子:

1 值: Authorization:Bearer ${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)
Run Code Online (Sandbox Code Playgroud)

如您所见,该变量access_token并未被 setup 调用中的值替换。

我试过的:

BeanShell 后处理器:

我创建了这个脚本,它实际上解析并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);
Run Code Online (Sandbox Code Playgroud)

JSON 提取器:

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
Run Code Online (Sandbox Code Playgroud)

关于为什么标题管理器不应用access_token结果值的任何想法?

谢谢!

Kir*_* S. 5

由于您在 setUp Thread Group 中设置了一个变量,因此您不能在另一个线程组中使用它,因为线程组不共享变量,只有属性

所以为了通过认证,你需要将它保存为一个属性:

${__setProperty(access_token, ${access_token})};
Run Code Online (Sandbox Code Playgroud)

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

props.put("access_token", access_token); 
Run Code Online (Sandbox Code Playgroud)

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

${__P(access_token)}
Run Code Online (Sandbox Code Playgroud)

还要记住,HTTP Header Manager 在任何线程启动之前初始化,因此您也不能因为这个原因在那里使用变量。例如检查这个问题

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