jmeter 如何将线程计数和循环计数从Beanshell后处理器传递给下一个线程组

okxuctiv  于 2023-03-23  发布在  Shell
关注(0)|答案(3)|浏览(251)

我有一个setUp线程组,在那里我运行一个jdbc请求来获取记录。然后我使用beanshell后处理器来修复线程计数和循环计数,然后将其作为属性传递给下一个线程组。
我的代码在下面。

import org.apache.jmeter.util.JMeterUtils;

int  totalRecords = Integer.valueOf(vars.get("UCID_#")).intValue(); //UCID - Column name

if(totalRecords<100){
   int noOfThreads = 5;
   int loopCount = (totalRecords/noOfThreads);
}

JMeterUtils.setProperty("noOfThreads", noOfThreads);
JMeterUtils.setProperty("loopCount", loopCount");

在下一个线程组中,我使用上面的属性来固定线程数和循环数。

${__property(noOfThreads)}
${__property(loopCount)}

如果我运行测试,我得到下面的错误。

ERROR o.a.j.u.BeanShellInterpreter: Error invoking bsh method: eval Sourced file: inline evaluation of: ``import java.io.File; import org.apache.jmeter.services.FileServer;  //jmeter spe . . . '' : Undefined argument: noOfThreads 
Problem in BeanShell script: org.apache.jorphan.util.JMeterException: Error invoking bsh method: eval   Sourced file: inline evaluation of: ``import java.io.File; import org.apache.jmeter.services.FileServer;  //jmeter spe . . . '' : Undefined argument: noOfThreads

然后我也试了下面的步骤,但是没有用

${__setProperty(noOfThreads,vars.get("noOfThreads"))};
${__setProperty(loopCount,vars.get("loopCount"))};

请大家帮我解决这个问题……先谢了。

3wabscal

3wabscal1#

你的noOfThreadsif块的局部变量,你不能在if块之外访问它。
你可以这样做:

import org.apache.jmeter.util.JMeterUtils;

int totalRecords = Integer.valueOf(vars.get("UCID_#")).intValue(); //UCID - Column name

int noOfThreads = 1;
int loopCount  = 1;

if(totalRecords<100){
   noOfThreads = 5;
   loopCount = (totalRecords/noOfThreads);
}

JMeterUtils.setProperty("noOfThreads", noOfThreads);
JMeterUtils.setProperty("loopCount", loopCount);
mrwjdhj3

mrwjdhj32#

首先,在JMeter中不鼓励使用Beanshell采样器,并且在运行负载测试时不建议使用。
您应该使用JSR 223采样器/后处理器/预处理器在脚本中编写自定义逻辑
下面是将值存储到property中的代码,您可以使用${__P()}或props.get()函数在同一测试计划的不同线程组中进行检索

def  totalRecords=Integer.valueOf(vars.get("UCID_val"))
def noOfThreads=5
def loopCount

if(totalRecords<100){
   loopCount=(totalRecords/noOfThreads)
}

//Setting the value to property
props.put("pNoOfThreads", String.valueOf(noOfThreads));
props.put("pLoopCount", String.valueOf(loopCount));

第一节第一节第一节第一节第一次
或者,您可以使用vars.putObject();getObject()来检索它。

flvtvl50

flvtvl503#

你需要把最后两行放在if block里面,因为noOfThreadsloopCount变量are only accessible在那里。

import org.apache.jmeter.util.JMeterUtils;

int totalRecords = Integer.valueOf(vars.get("UCID_#")).intValue(); //UCID - Column name

if (totalRecords < 100) {
    int noOfThreads = 5;
    int loopCount = (totalRecords / noOfThreads);
    JMeterUtils.setProperty("noOfThreads", noOfThreads);
    JMeterUtils.setProperty("loopCount", "loopCount");
}

另外,从JMeter 3.1开始,建议使用JSR223测试元素和Groovy语言进行脚本编写。
如果你的代码只在setUp Thread Group中的某个地方由一个线程执行,那应该没问题,但是如果你要从代码中进行加载或者使用“繁重”的加密操作,那么值得考虑迁移到Groovy。
更多信息:Beanshell vs. JSR223 vs. Java For JMeter: Complete Showdown

相关问题