Java 如何在Jmeter变量中存储数组值?
我有一个CSV文件,其中包含我使用BeanShell脚本读取的数据,并基于它填充ArrayListJava 如何在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
//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())代码>
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)