JMeter - 预处理器中设置的变量不适用于采样器
JMeter - Variable set in preprocessor is not available to sampler
我有一个相对简单的 JMeter 测试计划设置,如下所示:
https://imgur.com/c8BIzBB
与此相关的部分是 BeanShell 预处理器(显示为 设置元素数据)及其与 HTTP 请求采样器的关系(显示为 POST/元素)。这两个都在循环控制器内(显示为做几次)。
预处理器获取存储在 bsh.shared
对象上的一组数据,并随机选择一项。然后它设置一个名为 elementTypeId
.
的变量
当我 运行 此测试时,elementTypeId
被正确记录(因此我假设已设置)。但是,第一次,变量设置不正确,仍然显示为 ${elementTypeId}
。更多样本似乎已设置,但使用第 n-1 个值。
此处显示第一个失败示例:https://imgur.com/Gj2YAje
此处显示最终示例(和记录值):https://imgur.com/OW5HSsS
设置元素数据 - BeanShell 预处理器代码:
import java.util.Random;
import com.eclipsesource.json.*;
Random rand = new Random();
int idx = rand.nextInt(bsh.shared.elementTypes.size());
JsonValue elementType = bsh.shared.elementTypes.get(idx);
String elementTypeId = String.valueOf(elementType.get("id").asInt());
log.info(elementTypeId);
vars.put("elementTypeId", elementTypeId);
在我看来,采样器似乎在预处理器设置变量之前就开始了——这似乎与应该发生的事情相反。
根据 UBIK 的回答更新
当我禁用 SetQueryParams 预处理器时,似乎变量设置正确(尽管请求失败,因为它需要添加查询参数)。
SetQueryParams 预处理器:
import org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase;
if (sampler instanceof HTTPSamplerBase &&
sampler.getMethod().equalsIgnoreCase("post")) {
// add query parameter to url
var customPath = sampler.getPath() + '?' + sampler.getQueryString();
sampler.setPath(customPath);
// remove query parameter from body
arguments = sampler.getArguments();
while (arguments.getArgumentCount() > 1) {
arguments.removeArgument(arguments.getArgumentCount() - 1);
}
sampler.setArguments(arguments);
}
是否可以将两个预处理器应用于 POST 请求?
我认为您的问题可能来自其他预处理器:
- SetQueryParams 预处理器
根据 scoping rules ,这个为每个 HTTP 采样器运行。
在控制台中检查抛出的异常。
尝试解决这个问题
如果没有任何效果,请复制您的脚本,删除 Beanshell 预处理器并再次添加 BeanShell 并粘贴您的脚本。
这可能很愚蠢,但对我有用。
我有一个相对简单的 JMeter 测试计划设置,如下所示: https://imgur.com/c8BIzBB
与此相关的部分是 BeanShell 预处理器(显示为 设置元素数据)及其与 HTTP 请求采样器的关系(显示为 POST/元素)。这两个都在循环控制器内(显示为做几次)。
预处理器获取存储在 bsh.shared
对象上的一组数据,并随机选择一项。然后它设置一个名为 elementTypeId
.
当我 运行 此测试时,elementTypeId
被正确记录(因此我假设已设置)。但是,第一次,变量设置不正确,仍然显示为 ${elementTypeId}
。更多样本似乎已设置,但使用第 n-1 个值。
此处显示第一个失败示例:https://imgur.com/Gj2YAje
此处显示最终示例(和记录值):https://imgur.com/OW5HSsS
设置元素数据 - BeanShell 预处理器代码:
import java.util.Random;
import com.eclipsesource.json.*;
Random rand = new Random();
int idx = rand.nextInt(bsh.shared.elementTypes.size());
JsonValue elementType = bsh.shared.elementTypes.get(idx);
String elementTypeId = String.valueOf(elementType.get("id").asInt());
log.info(elementTypeId);
vars.put("elementTypeId", elementTypeId);
在我看来,采样器似乎在预处理器设置变量之前就开始了——这似乎与应该发生的事情相反。
根据 UBIK 的回答更新
当我禁用 SetQueryParams 预处理器时,似乎变量设置正确(尽管请求失败,因为它需要添加查询参数)。
SetQueryParams 预处理器:
import org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase;
if (sampler instanceof HTTPSamplerBase &&
sampler.getMethod().equalsIgnoreCase("post")) {
// add query parameter to url
var customPath = sampler.getPath() + '?' + sampler.getQueryString();
sampler.setPath(customPath);
// remove query parameter from body
arguments = sampler.getArguments();
while (arguments.getArgumentCount() > 1) {
arguments.removeArgument(arguments.getArgumentCount() - 1);
}
sampler.setArguments(arguments);
}
是否可以将两个预处理器应用于 POST 请求?
我认为您的问题可能来自其他预处理器:
- SetQueryParams 预处理器
根据 scoping rules ,这个为每个 HTTP 采样器运行。
在控制台中检查抛出的异常。 尝试解决这个问题
如果没有任何效果,请复制您的脚本,删除 Beanshell 预处理器并再次添加 BeanShell 并粘贴您的脚本。 这可能很愚蠢,但对我有用。