如何 运行 JSR223 PreProcessor only once

How to run JSR223 PreProcessor only once

我在 jMeter 中有一个测试计划,需要在 运行测试之前计算一些参数。为了计算这些参数,我直接在测试计划下创建了一个 JSR223 预处理器,如下所示。

我的问题是 PreProcessor 似乎在每个请求之前 运行 这不是我想要的。我只需要计算一次这些参数并在测试中使用它们。

有没有办法只运行 JSR223 预处理器一次,还是我应该使用其他方法?

提前致谢。

编辑:

正如@ubik-load-pack 所建议的,我尝试 "setUp Thread Group" 如下,但在代码中创建的变量在 "Thread Group" 下不可用。它们既不存在于日志中(代码中使用日志记录)也不存在于查看结果树中(通过调试后处理器)

我也试了"Once Only Controller",还是不行,同上。

有关更多信息,请参阅我的 JSR223 预处理器的内容。 (不是全部代码,这里会有更多的变量,所以顺便说一句,使用日期函数对我来说不是一个解决方案。)

通过在任何采样器 运行s 之前设计预处理器 运行s。

因此,如果您只想 运行 每个用户一次,您可以执行以下操作:

如果您希望对所有用户执行一次,请使用setupThreadGroup 它将包含您的 JSR223 采样器并使用 1 个线程配置它。它会在常规线程组启动前 运行 一次。

更新问题后进行编辑:

  • 如我所写,如果您想在线程组中重用变量,则不能使用 setupThreadGroup 方法,因此请坚持使用 OnceOnlyController 方法处理您的请求

  • 使用 Once Only Controller 它不起作用,因为您误读了我的回答,我建议使用 JSR223 Sampler 而不是 PreProcessor,因为预处理器将 运行 仅当存在 运行s.

  • 的采样器时

如果您使用采样器,并且有多个线程组,那么您必须将该采样器复制到每个线程组中,因为您不能将采样器放在线程组之外。

您可以将 jsr223 预处理器用于:

if(vars.get("init")=="OK") return;
vars.put("init","OK")

//your code

我在预处理器的顶部做了一个稍微脏的解决方法:

log.info("in PreProcessor. Sampler name: " + sampler.getName())
if (sampler.getName() != "HTTP Request") {
    log.info("not running again")
    return
}

在我的例子中,我不能添加另一个采样器,因为它会打乱我的计时器计算。