我有一个CSV文件,其中包含我使用Bean Shell脚本读取的数据,并根据它填充ArrayList .Below是它的代码。
//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访问populate函数的ArrayList脚本。
如何在这种情况下实现随机化,因为从性能的角度来看,每次调用populate函数都不好。
答案 0 :(得分:3)
vars.put
仅支持String值。有vars.putObject:
脚本也可以使用get()和put()访问JMeter变量 " vars"的方法变量,例如:vars.get(" HOST"); vars.put(" MSG""成功&#34); 。仅限get()和put()方法 支持带String值的变量,但也有getObject() 和putObject()方法,可用于任意对象。 JMeter变量是线程的本地变量,但可以被所有测试使用 元素(不仅仅是Beanshell)。
答案 1 :(得分:2)
我建议使用bsh.shared命名空间,这样您就可以存储任何Java对象,并在需要时甚至可以从不同的线程组访问它。
JMeter特定示例位于Sharing Variables章
中的官方文档中在第一个脚本结束时:
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脚本编制的更多详细信息,请参阅How to use BeanShell: JMeter's favorite built-in component指南。
答案 2 :(得分:0)
希望这会对某人有所帮助。
要全局共享变量,即在所有线程组中的所有线程之间共享变量,请使用props
。
例如,
在安装程序线程组中,执行此操作
props.put("mylist", new ArrayList());
现在,在线程组中的每个线程的后处理器中,将值添加到列表中。
props.get("mylist").add(<some value>);
在拆除线程组中,再次获取整个列表。
log.info(props.get("mylist").toString());
在线程组中,列表由多个线程更新,然后更喜欢使用Vector而不是ArrayList。
Ref:scope-of-variables-sharing-among-threads-and-thread-groups