Java 如何在Jmeter变量中存储数组值?

Java 如何在Jmeter变量中存储数组值?,java,jmeter,Java,Jmeter,我有一个CSV文件,其中包含我使用BeanShell脚本读取的数据,并基于它填充ArrayList //Populate Beanshell script import java.text.*; import java.io.*; import java.util.*; ArrayList strList = new ArrayList(); try { File file = new File("path/to/csv"); if (!file.exists()) { t

我有一个CSV文件,其中包含我使用BeanShell脚本读取的数据,并基于它填充ArrayList

//Populate Beanshell script
import java.text.*;
import java.io.*;
import java.util.*;

ArrayList strList = new ArrayList();    

try {
File file = new File("path/to/csv");

if (!file.exists()) {
    throw new Exception ("ERROR: file not found");
}

BufferedReader bufRdr = new BufferedReader(new FileReader(file));
String line = null;

while((line = bufRdr.readLine()) != null) {
    strList.add(line);
}

bufRdr.close();   
}
catch (Exception ex) {
IsSuccess = false; 
log.error(ex.getMessage());
System.err.println(ex.getMessage());
}
catch (Throwable thex) {
System.err.println(thex.getMessage());
}
现在我想以一种随机的方式利用这些数据,所以我尝试使用类似这样的东西

//Consumer bean shell script
//Not able to access strList since vars.put cannot store an object
Random rnd = new java.util.Random(); 
vars.put("TheValue",strList.get(rnd.nextInt(strList.size())));
但我无法做到这一点,因为在vars.put中,我无法存储数组或列表,只能存储基元类型。因此,我无法从另一个BeanShell脚本访问填充函数的ArrayList


在这种情况下,如何实现随机化,因为每次调用populate函数从性能角度来看都不太好。

vars.put
仅支持字符串值。有:

脚本还可以使用get()和put()访问JMeter变量 “vars”变量的方法,例如:vars.get(“主机”); 变量put(“MSG”,“Successful”)。仅限get()和put()方法 支持带有字符串值的变量,但也有getObject() 和putObject()方法,可用于任意对象。 JMeter变量是线程的本地变量,但可供所有测试使用 元素(不仅仅是Beanshell)

我建议使用名称空间,这样您就可以存储任何Java对象,并在需要时从不同的线程组访问它

JMeter的具体示例在第章的官方文档中

在第一个脚本的末尾:

bsh.shared.strList = strList;
在第二个脚本的开头:

List strList = bsh.shared.strList;


Random rnd = new java.util.Random(); 
vars.put("TheValue",strList.get(rnd.nextInt(strList.size())));

有关针对JMeter的Beanshell脚本的更多详细信息,请参阅指南

希望这能帮助别人

要全局共享变量,即在所有线程组中的线程之间共享变量,请使用
props

例如

  • 在设置线程组中,执行此操作
    props.put(“mylist”,newArrayList())

  • 现在,在线程组中每个线程的后处理器中,将值添加到列表中

  • 在分解线程组中,再次获取整个列表。
    log.info(props.get(“mylist”).toString())

在线程组中,列表由多个线程更新,然后更喜欢使用Vector而不是ArrayList


Ref:

什么类型的
vars
?vars是BeanShell脚本,就像Map一样思考。put你能演示一下如何创建
vars
?没有创建vars,这是特定于Jmeter的,我可以在那里存储vars.put(“key”,value)这样的变量。然后我可以像“${key}”那样访问它在任何Jmeter脚本中。问题是我想在其中放置一个对象类型,如ArrayList,但这是无法做到的,任何人都可以建议替代方法。这似乎更好。但现在还有另一个问题,有时值不会被替换。它就像“Thevalue”而不是实际的内容。可能是因为我正在运行多线程测试。我知道这是一个不同的问题,但我还是被它卡住了。线程安全是一个问题吗?你可以通过
vars.put(“TheValue”+ctx.getThreadNum(),strList.get(rnd.nextInt(strList.size()))因此,对于第一个线程,它将是
值1
,对于第二个线程,它将是
值2
,等等。有一个
\uu threadNum()
函数,可以在非Beanshell测试元素中用于获取当前线程号:现在可以在变量上使用getObject()和putObject()。您尝试过这个吗?实际上,它抛出了错误:javax.script.ScriptException:groovy.lang.MissingMethodException:org.apache.jmeter.threads.JMeterVariables.put()方法的签名不适用于参数类型:(java.lang.String,java.util.ArrayList$SubList)