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

时间:2013-01-23 09:37:06

标签: csv jmeter load-testing jmeter-plugins

我需要测试一个站点的各种链接(不需要登录)和100个用户,并使用JMeter循环它多次。我想将这些链接放在“CSV文件”中,以便从文件中读取所有要测试的链接。

如何完成此任务?

2 个答案:

答案 0 :(得分:18)

使用test-params列表准备一种csv文件,并使用它来参数化测试采样器,至少使用以下内容:

  1. CSV Data Set Config

    查看以下链接了解详情:

    How to get Jmeter to use CSV data for GET parameters?
    Use jmeter to test multiple Websites
    use csv parameters in jmeter httprequest path
    Force a thread to use same input line when using CSV Data Set Config

  2. Jmeter功能:

  3. 来自Variables From CSV
  4. jmeter-plugins采样器。


  5. 1。在csv文件中准备测试网址,例如采用以下格式:

        url1
        url2
        ...
        urlN
    

    确保测试网址不包含http://前缀(根据HTTP Request params - >服务器)。

    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个用户,每个用户将从test-url列表中读取M个条目。如果M>测试网址列表中的条目数,然后用户将在EOF上回收列表。

答案 1 :(得分:0)

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

我在另一篇文章(https://stackoverflow.com/a/64086009/4832515)中发布了我的答案,但是我会复制并粘贴它,以防将来链接失效。


我找不到一个简单的解决方案。我最终使用了beanshell脚本,该脚本使您可以使用与Java非常相似的代码来进行一些自定义操作。我以JMeter项目为例,演示了如何做到这一点(是的,这很复杂,考虑到我要做的就是重复读取CSV):


  1. 文件:

我的文件结构:

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",

所以在这个线程组中,我将只有1个用户,并且我将循环2次。我打算每CSV行发送1个请求。因此,总共应该发送6个请求。

  1. 线程组

enter image description here


  1. 用户定义的变量

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

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

如果将CSV保存在除包含JMeter文件的目录之外的其他文件夹中,则需要提供一个绝对路径,然后对下面的beanshell脚本进行一些修改:您需要注释掉加载的行相对文件,并在从绝对路径加载的行中注释。

enter image description here


  1. 用于解析和存储CSV行的BeanShell Sampler

添加一个Beanshell采样器,该采样器将基本上采用一条路径,并将每一行解析并存储为变量。第一行将存储为名为csv_line_0的变量,第二行将存储为csv_line_1,依此类推。我知道这不是一个干净的解决方案,但是...我找不到执行此干净简单任务的任何干净简单方法。我在下面复制并粘贴了代码。

enter image description here

import org.apache.jmeter.services.FileServer;
import java.text.*;
import java.io.*;
import java.util.*;

String temp = null;

ArrayList lines = new ArrayList();

BufferedReader bufRdr;

ArrayList strList = new ArrayList();     

// get the file
try {
    // you can use this line below if your csvFilePath is an absolute path
    // File file = new File(${csvFilePath});

    // you can use this line below if your csvFilepath is a relative path, relative to where you saved this JMeter file
    File file = new File(org.apache.jmeter.services.FileServer.getFileServer().getBaseDir() + "/" + ${csvFilePath});

    if (!file.exists()) {
        throw new Exception ("ERROR: file " + filename + " not found");
    }

    bufRdr = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF8"));
} catch(Exception e){
    log.error("failed to load file");
    log.error(e.getMessage());
    return;
}

// For each CSV line, save it to a variable
int counter = 0;
while(true){
    try{
        temp = bufRdr.readLine();
        if(temp == null || temp.equals("<EOF>")){
            break;
         }
         lines.add(temp);
         vars.put("csv_line_" + String.valueOf(counter), temp);
        counter++;

        

    } catch(Exception e){
        log.error("failed to get next line");
        log.error(e.getMessage());
        break;
    }
}

// store the number of CSV lines there are for the loop counter
vars.put("linesCount", String.valueOf(lines.size()));

  1. 循环控制器

添加一个循环控制器,该循环控制器为每个CSV行循环一次。 ${linesCount}是CSV行数的计数,是根据上述beanShell脚本计算得出的。

enter image description here


  1. Beanshell脚本可从当前CSV行提取数据

此脚本将在每个CSV行中运行一次。它将抓取当前行,并解析出其中的任何数据。您必须修改此脚本才能获取所需的数据。在我的示例中,我只有2列,其中第1列是“ guestId”,而第2列是“地址”。

__jm__loopController__idx是JMeter为您定义的变量,并且是循环控制器的索引。变量名称为__jm__{loop controller name}__idx

enter image description here

String index = vars.get("__jm__loopController__idx");
String line = vars.get("csv_line_" + index);
String [] tokens = line.split(",");
vars.put("guestId", tokens[0]);
vars.put("address", tokens[1]);

  1. Http请求采样器

这是使用提取的数据的HTTP请求。

enter image description here


  1. 结果

运行此代码时,根据需要,我最终向我定义的端点发送了6个http请求。

enter image description here