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 并粘贴您的脚本。 这可能很愚蠢,但对我有用。