2012-04-17 164 views
1

我在创造JMeter的测试场所,其浏览次数(2 - 10)网页的随机量的过程中,其URL被从CSV数据集获取。我创建了CSV数据集和正常工作的采样器,只是每个线程只从数据集中读取一行,这不是我需要的 - 我希望在采样器完成后读取新行(或之前,我没有受到伤害)。如何从JMeter的CSV数据集配置中读取下一行?

我看到this question非常相似,该解决方案是使用Raw Data Source预处理器,它的工作,但需要在问题(加块每行前大小)艰苦改建为文件,这是一个有点当文件大约500行时,疼痛。

有没有一种方法我可以设置CSV数据集,以推进到下一行上阅读,或者使用一些后或前处理,如BeanShell中,为了做到这一点?我看到有人说CSVRead可以做到这一点,但是这表明访问是按线程进行的,这对我来说并不好。作为一个说明 - 最终我要做的就是访问传递给HTTP采样器的文件中的一个随机行,如果有更简单或更好的方式来做到这一点,我愿意提供建议。

+0

有合适的解决方案吗? – 2012-05-10 16:11:47

回答

2

您可以使用从这个beanshell(= java)代码执行BeanShell Sampler/BeanShell PostProcessor/BeanShell PreProcessor

下面的代码将读取你的文件中的所有行,然后选择一个随机:

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在这个例子中)。

我只怀疑在每次迭代时读取完整文件(如果必须在循环中执行此操作)从性能的角度来看是很好的解决方案。

相关问题