我正在JMeter中创建一个测试位置的过程,该测试位置访问随机数量的页面(从2到10),其URL将从CSV数据集中获取。我已经创建了CSV数据集和工作正常的采样器,除了每个线程只从数据集读取一行,这不是我需要的 - 我希望在采样器完成后读取新行(或之前,我没有被激怒)。
我看到this question非常相似,解决方案是使用Raw Data Source预处理器,它确实有效,但需要对相关文件进行艰苦的更改(在每行之前添加块大小) ,当文件长约500行时,这有点痛苦。
有没有办法可以将CSV数据集设置为在读取时前进到下一行,或者使用某些帖子或预处理器(例如beanshell)来执行此操作?我看到有人声称CSVRead可以做到这一点,但是这表明访问是每个线程的,这对我没有好处。
作为附注 - 最终我想要做的就是访问文件中的随机行,该行被传递给HTTP采样器,如果有更简单或更好的方法,我可以接受建议。
答案 0 :(得分:2)
您可以使用从BeanShell Sampler / BeanShell PostProcessor / BeanShell PreProcessor执行的此beanshell(= java)代码。
以下代码将读取文件中的所有行,然后选择单个随机:
import java.text.*;
import java.io.*;
import java.util.*;
String [] params = Parameters.split(",");
String csvTest = params[0];
String csvDir = params[0];
ArrayList strList = new ArrayList();
try {
File file = new File(System.getProperty("user.dir") + File.separator + csvDir + File.separator + csvTest);
if (!file.exists()) {
throw new Exception ("ERROR: file " + csvTest + " not found in " + csvDir + " directory.");
}
BufferedReader bufRdr = new BufferedReader(new FileReader(file));
String line = null;
while((line = bufRdr.readLine()) != null) {
strList.add(line);
}
bufRdr.close();
Random rnd = new java.util.Random();
vars.put("csvUrl",strList.get(rnd.nextInt(strList.size())));
}
catch (Exception ex) {
IsSuccess = false;
log.error(ex.getMessage());
System.err.println(ex.getMessage());
}
catch (Throwable thex) {
System.err.println(thex.getMessage());
}
然后您可以通过变量访问提取的URL(在此示例中为$ {csvUrl})。
我怀疑只是在每次迭代中读取完整文件(如果你必须在循环中执行它)从性能的角度来看是一个很好的解决方案。