我需要测试一个站点的各种链接(不需要登录)和100个用户,并使用JMeter循环它多次。我想将这些链接放在“CSV文件”中,以便从文件中读取所有要测试的链接。
如何完成此任务?
答案 0 :(得分:18)
使用test-params列表准备一种csv文件,并使用它来参数化测试采样器,至少使用以下内容:
查看以下链接了解详情:
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
Jmeter功能:
jmeter-plugins采样器。
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):
我的文件结构:
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个请求。
这是可选的,但文件路径可能会更改,我不喜欢仅出于配置更改而更改脚本。因此,我将CSV文件名存储在“用户定义的变量”节点中。
如果将CSV文件存储在与JMeter测试相同的目录中,则只能指定文件名。
如果将CSV保存在除包含JMeter文件的目录之外的其他文件夹中,则需要提供一个绝对路径,然后对下面的beanshell脚本进行一些修改:您需要注释掉加载的行相对文件,并在从绝对路径加载的行中注释。
添加一个Beanshell采样器,该采样器将基本上采用一条路径,并将每一行解析并存储为变量。第一行将存储为名为csv_line_0
的变量,第二行将存储为csv_line_1
,依此类推。我知道这不是一个干净的解决方案,但是...我找不到执行此干净简单任务的任何干净简单方法。我在下面复制并粘贴了代码。
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()));
添加一个循环控制器,该循环控制器为每个CSV行循环一次。 ${linesCount}
是CSV行数的计数,是根据上述beanShell脚本计算得出的。
此脚本将在每个CSV行中运行一次。它将抓取当前行,并解析出其中的任何数据。您必须修改此脚本才能获取所需的数据。在我的示例中,我只有2列,其中第1列是“ guestId”,而第2列是“地址”。
__jm__loopController__idx
是JMeter为您定义的变量,并且是循环控制器的索引。变量名称为__jm__{loop controller name}__idx
。
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]);
这是使用提取的数据的HTTP请求。
运行此代码时,根据需要,我最终向我定义的端点发送了6个http请求。