准备一种包含测试参数列表的csv文件,并使用它来对测试采样器进行参数化,至少使用以下内容:
请查看以下链接获取详细信息:
如何让Jmeter使用CSV数据作为GET参数?
使用Jmeter测试多个网站
在Jmeter的httprequest路径中使用csv参数
当使用CSV数据集配置时,强制线程使用相同的输入行
Jmeter函数:
1. 准备您的测试URL,保存在csv文件中,例如以下格式:
url1
url2
...
urlN
确保测试URL不包含http://
前缀(根据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
我找不到一个简单的解决方案。最终我使用 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",
所以在此线程组中,我只会有一个用户,并循环2次。我打算每CSV行发送1个请求。因此总共应发送6个请求。
这是可选的,但是文件路径可能会发生变化,我不想因为配置的更改而修改我的脚本。因此,我将CSV文件名存储在“用户定义变量”节点中。
如果您将CSV文件存储在与JMeter测试相同的目录中,只需指定文件名即可。
如果您将CSV保存在与包含JMeter文件的目录不同的文件夹中,则需要提供绝对路径,然后稍微修改下面的beanshell脚本:您需要注释掉相对加载文件的行,并注释掉从绝对路径加载的行。
添加一个BeanShell Sampler,它将基本上接受一个路径,并将每一行解析并存储为一个变量。第一行将被存储为一个名为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脚本中计算得出。
__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请求。