创建性能脚本时遇到问题,该问题与从csv数据配置中读取数据有关。
我的脚本的结构如下:
setup Thread
Create csv Thread. After view dashboard, using Json extractor to get list of data and put it to csv file
创建csv文件-在此线程之后,基于中心数,我将有很多csv文件。例如:4个名称不同的文件
String[] attempt = (vars.get("ListAttemptId_ALL")).split(",");
int length = attempt.length;
String dir = props.get("UserFilePath").toString();
String center = vars.get("Center");
File csvFile = new File(dir, center + ".csv");
if(!csvFile.exists()){
FileWriter fstream = new FileWriter(csvFile);
BufferedWriter out = new BufferedWriter(fstream);
for(int i = 1; i <= length; i++){
out.write(attempt[i-1]);
out.write(System.getProperty("line.separator"));
}
out.close();
fstream.close();
}
下一个线程获取文件名,并使用CSV文件进行循环 所有行
String center = vars.get("Center");
String fileName = center + ".csv";
props.put("path_${__threadNum}", String.valueOf(fileName));
因为我有很多线程将运行同一文件,所以我只检查__threadNum即可找到该线程需要使用的文件名。 我正在使用循环控制器遍历CSV文件,运行到文件末尾将停止线程。在这个循环中
CSV data Set config:
Filename: ${__property(UserFilePath)}\\${__P(path_${__threadNum})}
其中$ {____ property(UserFilePath)} =文件夹的路径,以及 $ {__ P(path _ $ {__ threadNum})}是提取的csv文件的名称
我的问题是此代码不稳定,有时线程可以正常读取文件,有时显示错误文件不存在(实际上确实存在),因此很难追究问题出处。谁能为我的问题提出解决方案?还是建议任何比我的解决方案更好的主意来读取线程组中的csv文件?
答案 0 :(得分:1)
我对这个问题有答案:
-我将所有AttemptId,Center数据添加到一个csv文件中,并从头到尾读取。在操作前使用If控制器验证数据。
答案 1 :(得分:0)
此语句可能有问题:
props.put("path_${__threadNum}", String.valueOf(fileName));
按照JSR223 Sampler documentation
JMeter在将脚本字段传递给解释器之前先处理函数和变量引用,因此引用将仅被解析一次。脚本文件中的变量和函数引用将逐字传递给解释器,这可能会导致语法错误。为了使用运行时变量,请使用适当的道具 方法,例如
props.get("START.HMS"); props.put("PROP1","1234");
因此,我建议将${__threadNum}
替换为ctx.getThreadNum()
,其中ctx
是JMeterContext类的缩写
根据JMeter文档的Execution Order章:
0. Configuration elements
1. Pre-Processors
2. Timers
3. Sampler
4. Post-Processors (unless SampleResult is null)
5. Assertions (unless SampleResult is null)
6. Listeners (unless SampleResult is null)
您的CSV Data Set Config首先在任何其他脚本测试元素之前 执行。因此,当“ JMeter属性”是全局的且在“ JMeter”(和底层JVM)运行时“处于活动状态”时,“虚假”情况会导致IMO“正常工作”。下次启动JMeter时,属性将为null,并且CSV数据集配置将失败。因此,我的期望是您应该考虑使用__CSVRead()函数,而不是在运行时中准确地在调用该函数的位置对其进行评估。请查看Apache JMeter Functions - An Introduction文章,以详细了解JMeter Functions概念。