使用CSV文件从中读取测试数据

使用CSV文件从中读取测试数据,csv,jmeter,load-testing,jmeter-plugins,Csv,Jmeter,Load Testing,Jmeter Plugins,我需要用100个用户测试一个站点的各种链接(无需登录),并使用JMeter将其循环若干次。我想把这些链接放在一个“CSV文件”中,这样所有要测试的链接都可以从文件中读取 如何完成此任务?准备一种csv文件,其中包含测试参数列表,并使用它对测试采样器进行参数化,至少使用以下内容: 有关详细信息,请查看以下链接: Jmeter功能: , 采样器来自 1。在csv文件中准备您的测试URL,例如以下格式: url1 url2 ... urlN 确保测试

我需要用100个用户测试一个站点的各种链接(无需登录),并使用JMeter将其循环若干次。我想把这些链接放在一个“CSV文件”中,这样所有要测试的链接都可以从文件中读取


如何完成此任务?

准备一种csv文件,其中包含测试参数列表,并使用它对测试采样器进行参数化,至少使用以下内容:

  • 有关详细信息,请查看以下链接:





  • Jmeter功能:

    • ,
  • 采样器来自


  • 1。在csv文件中准备您的测试URL,例如以下格式:

        url1
        url2
        ...
        urlN
    
    确保测试URL不包含
    http://
    前缀(根据->服务器)

    2.对脚本使用模式,如下所示:

        CSV Data Set Config:
        Filename: [path to your csv-file with test-urls]
        Variable Names: testURL
        Recycle on EOF?: True
        Stop thread on EOF?: False
        Sharing mode: Current thread
    
        Thread Group:
        Number of Threads: N
        Loop Count: M
                HTTP Request // your http call
                Server Name or IP: ${testURL} // use variable with extracted URL
    

    这将启动N个用户,每个用户将从测试URL列表中读取M个条目。如果M>测试URL列表中的条目数,则用户将在EOF上回收该列表。

    在其中一条注释中,提到每个循环不能多次读取CSV。您可以使用多个线程,每个线程读取CSV文件一次,但该文件已关闭,在下一个循环中不会被读取。此外,如果将CSV设置为“回收”,则CSV文件将被无限期地反复读取。因此,问题变成了如何将CSV文件循环一定次数而不是无限循环

    我在另一篇帖子()中发布了我的答案,但我将复制并粘贴它,以防将来该链接不起作用


    我找不到一个简单的解决办法。我最终使用了beanshell脚本,它让您可以使用非常类似于java的代码来完成一些定制工作。我制作了一个JMeter项目示例来演示如何执行此操作(是的,考虑到我只想重复CSV读取,它非常复杂):


  • 档案:
  • 我的文件结构:

    JMeterExample
    |
    ⊢--JMeterTests.jmx             // the JMeter file
    ⊢--example.csv                 // the CSV file
    
    我的CSV的内容:

    guest-id-1,"123 fake street",
    guest-id-2,"456 fake street",
    guest-id-3,"789 fake street",
    

    在这个线程组中,我只需要一个用户,我将循环两次。我打算每个CSV行发送一个请求。所以总共应该发送6个请求

  • 螺纹组

  • 用户定义变量
  • 这是一种可选的,但是文件路径可能会更改,我不喜欢仅仅为了更改配置而更改脚本。因此,我将CSV文件名存储在“用户定义变量”节点中

    如果将CSV文件存储在与JMeter测试相同的目录中,则只需指定文件名即可

    如果要将CSV保存在包含JMeter文件的目录以外的文件夹中,则需要提供绝对路径,然后稍微修改下面的beanshell脚本:需要注释掉相对加载文件的行,并注释从绝对路径加载的行


  • 用于解析和存储CSV行的BeanShell采样器
  • 添加一个Beanshell采样器,它基本上接受一条路径,并将每一行作为变量进行解析和存储。第一行将存储为名为
    csv\u line\u 0
    的变量,第二行将存储为
    csv\u line\u 1
    ,依此类推。我知道这不是一个干净的解决方案但是。。。我找不到任何干净简单的方法来完成这个干净简单的任务。我在下面复制并粘贴了我的代码

    import org.apache.jmeter.services.FileServer;
    导入java.text.*;
    导入java.io.*;
    导入java.util.*;
    字符串temp=null;
    ArrayList行=新的ArrayList();
    BufferedReader bufRdr;
    ArrayList strList=新的ArrayList();
    //获取文件
    试一试{
    //如果csvFilePath是绝对路径,则可以使用下面的这一行
    //File File=新文件(${csvFilePath});
    //如果csvFilepath是相对路径,则可以使用下面这一行,相对于保存此JMeter文件的位置
    File File=新文件(org.apache.jmeter.services.FileServer.getFileServer().getBaseDir()+“/”+${csvFilePath});
    如果(!file.exists()){
    抛出新异常(“错误:文件“+文件名+”未找到”);
    }
    bufRdr=新的BufferedReader(新的InputStreamReader(新文件InputStream(文件),“UTF8”);
    }捕获(例外e){
    log.error(“加载文件失败”);
    log.error(例如getMessage());
    返回;
    }
    //对于每个CSV行,将其保存到变量中
    int计数器=0;
    while(true){
    试一试{
    temp=bufRdr.readLine();
    如果(temp==null | | temp.equals(“”){
    打破
    }
    行。添加(临时);
    变量输入(“csv_行_”+字符串值(计数器),温度);
    计数器++;
    }捕获(例外e){
    log.error(“获取下一行失败”);
    log.error(例如getMessage());
    打破
    }
    }
    //存储循环计数器的CSV行数
    vars.put(“linescont”,String.valueOf(lines.size());
    

  • 回路控制器
  • 添加循环控制器,每个CSV行循环一次
    ${linescont}
    是CSV行数的计数,根据上述beanShell脚本计算得出


  • 用于从当前CSV行提取数据的Beanshell脚本
  • 此脚本将每CSV行运行一次。它将获取当前行,并解析出其中的任何数据。您必须修改此脚本才能获得所需的数据。在我的示例中,我只有两列,其中第1列是“guestId”,第2列是“address”

    \uujm\uuuu loopController\uuuu idx
    是JMeter为您定义的变量,是循环控制器的索引。变量名为
    \uujm\uuu{loop controller name}\uuuuidx

    String index=vars.get(“_jm__loopController__idx”);
    字符串行=vars.get(“csv_行”+索引);
    String[]tokens=line.split(“,”);
    变价出售(“guestId”,代币[0]);
    可变投入(“地址”,代币[1]);
    

  • Http请求采样器
  • 下面是使用提取的数据的HTTP请求


  • 结果
  • 当运行此命令时,如所愿