从jmeter读取csv数据配置时出现Somtime问题

时间:2019-01-18 14:54:01

标签: multithreading csv jmeter

创建性能脚本时遇到问题,该问题与从csv数据配置中读取数据有关。

我的脚本的结构如下:

  • setup Thread
  • Create csv Thread. After view dashboard, using Json extractor to get list of data and put it to csv file
  

创建csv文件-在此线程之后,基于中心数,我将有很多csv文件。例如:4个名称不同的文件

String[] attempt = (vars.get("ListAttemptId_ALL")).split(",");
int length = attempt.length;
String dir = props.get("UserFilePath").toString();
String center = vars.get("Center");

File csvFile = new File(dir, center + ".csv");

if(!csvFile.exists()){
    FileWriter fstream = new FileWriter(csvFile);
    BufferedWriter out = new BufferedWriter(fstream);

    for(int i = 1; i <= length; i++){
            out.write(attempt[i-1]);
            out.write(System.getProperty("line.separator"));
    }
    out.close();
    fstream.close();
}
  

下一个线程获取文件名,并使用CSV文件进行循环   所有行

String center = vars.get("Center"); 
String fileName = center + ".csv";
props.put("path_${__threadNum}", String.valueOf(fileName));
  

因为我有很多线程将运行同一文件,所以我只检查__threadNum即可找到该线程需要使用的文件名。   我正在使用循环控制器遍历CSV文件,运行到文件末尾将停止线程。在这个循环中

CSV data Set config:  
Filename: ${__property(UserFilePath)}\\${__P(path_${__threadNum})}  
  

其中$ {____ property(UserFilePath)} =文件夹的路径,以及   $ {__ P(path _ $ {__ threadNum})}是提取的csv文件的名称

我的问题是此代码不稳定,有时线程可以正常读取文件,有时显示错误文件不存在(实际上确实存在),因此很难追究问题出处。谁能为我的问题提出解决方案?还是建议任何比我的解决方案更好的主意来读取线程组中的csv文件?

2 个答案:

答案 0 :(得分:1)

我对这个问题有答案:
-我将所有AttemptId,Center数据添加到一个csv文件中,并从头到尾读取。在操作前使用If控制器验证数据。

答案 1 :(得分:0)

  1. 此语句可能有问题:

    props.put("path_${__threadNum}", String.valueOf(fileName));
    

    按照JSR223 Sampler documentation

      

    JMeter在将脚本字段传递给解释器之前先处理函数和变量引用,因此引用将仅被解析一次。脚本文件中的变量和函数引用将逐字传递给解释器,这可能会导致语法错误。为了使用运行时变量,请使用适当的道具   方法,例如

    props.get("START.HMS");
    
    props.put("PROP1","1234"); 
    

    因此,我建议将${__threadNum}替换为ctx.getThreadNum(),其中ctxJMeterContext类的缩写

  2. 根据JMeter文档的Execution Order章:

    0. Configuration elements
    1. Pre-Processors
    2. Timers
    3. Sampler
    4. Post-Processors (unless SampleResult is null)
    5. Assertions (unless SampleResult is null)
    6. Listeners (unless SampleResult is null)
    

    您的CSV Data Set Config首先在任何其他脚本测试元素之前 执行。因此,当“ JMeter属性”是全局的且在“ JMeter”(和底层JVM)运行时“处于活动状态”时,“虚假”情况会导致IMO“正常工作”。下次启动JMeter时,属性将为null,并且CSV数据集配置将失败。因此,我的期望是您应该考虑使用__CSVRead()函数,而不是在运行时中准确地在调用该函数的位置对其进行评估。请查看Apache JMeter Functions - An Introduction文章,以详细了解JMeter Functions概念。