Jmeter 使用CSV数据集配置和EOF条件时出现问题
我在while循环中使用了一个CSv数据集配置。我把它放在一个模块中,并在测试中多次使用同一个模块 我的第一个问题是,我使用以下条件设置了while循环:Jmeter 使用CSV数据集配置和EOF条件时出现问题,jmeter,Jmeter,我在while循环中使用了一个CSv数据集配置。我把它放在一个模块中,并在测试中多次使用同一个模块 我的第一个问题是,我使用以下条件设置了while循环: ${__javaScript("${data}"!="<EOF>")} ${{uuuJavaScript(${data})!=”)} “数据”是我的csv文件中的第一列。除了上一次迭代${data}设置为“EOF”并对其执行所有测试之外,这一切都很好。我希望它在此之前停止,而不是在所有测试都在它上运行一次之后 我的另一个问题是
${__javaScript("${data}"!="<EOF>")}
${{uuuJavaScript(${data})!=”)}
“数据”是我的csv文件中的第一列。除了上一次迭代${data}设置为“EOF”并对其执行所有测试之外,这一切都很好。我希望它在此之前停止,而不是在所有测试都在它上运行一次之后
我的另一个问题是,当我稍后再次使用此模块时,${data}仍然设置为“EOF”,并且根本不运行任何测试。如果使用循环控制器,CSV行数就是迭代次数,则可以避免这种情况。只需将此代码放入Beanshell Sampler:
import org.apache.commons.io.FileUtils;
int lines = FileUtils.readLines(new File("/home/username/csv.file")).size();
vars.put("linesCount", String.valueOf(lines));
之后,您可以在循环控制器中使用lineCount
如果您的数据
变量需要恢复到原始状态,您可以在其他变量中存储默认值,并在循环结束时使用Beanshell pre/post proccesor将数据恢复到原始状态
编辑:
或者,您可以在While控制器中插入If控制器,并仅在数据不等于EOF时处理所有子元素:
${{uuuJavaScript(${data})!=”)}
要避免此
位,只需将您的逻辑放在下面,然后使用“${data}”!=“
作为“条件”
有关此用例和其他常见用例的详细说明,请参见指南
UPD。重复使用相同的CSV文件: 在第一个While控制器之后和第二个While控制器之前添加一个,并在“脚本”区域中使用以下代码: 上述脚本将“关闭”原始CSV文件,以便以后可以在脚本中重复使用,并“清除”包含
值的${data}
变量
有关在JMeter测试中使用Beanshell脚本的详细信息,请参阅指南。之前关于去重新使用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\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());
${linescont}
是CSV行数的计数,根据上述beanShell脚本计算得出
JMeterExample
|
⊢--JMeterTests.jmx // the JMeter file
⊢--example.csv // the CSV file
guest-id-1,"123 fake street",
guest-id-2,"456 fake street",
guest-id-3,"789 fake street",