JMeter - 采样器无法使用预处理器中的变量集

时间:2018-02-02 16:09:13

标签: java jmeter beanshell

我有一个相对简单的JMeter测试计划设置,如下所示: https://imgur.com/c8BIzBB

相关部分是BeanShell预处理器(显示为安装元素数据)及其与HTTP请求采样器的关系(显示为 POST / elements )。这两个都在一个循环控制器内(显示为做几次)。

预处理器获取存储在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 PreProcessor时,似乎变量设置正确(尽管请求失败,因为它需要添加查询参数)。

SetQueryParams PreProcessor:

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请求?

2 个答案:

答案 0 :(得分:0)

我认为您的问题可能来自其他PreProcessor:

  • SetQueryParams PreProcessor

根据scoping rules,这个针对每个HTTP采样器运行。

答案 1 :(得分:0)

在控制台中检查是否引发了异常。 尝试解决这个问题

如果没有任何效果,请复制您的脚本,删除Beanshell预处理程序,然后再次添加BeanShell并粘贴您的脚本。 这可能很愚蠢,但对我有用。