如何用JMeter的CSVRead()函数实现多线程逐行读取单列多行CSV文件?
用JMeter的CSVRead()函数实现多线程逐行读取单列CSV的方法
嘿,我来一步步教你实现这个需求:
1. 先搞定CSV文件准备
你的Perf_EC.csv是单列10行对吧?先确保文件格式没问题,比如内容大概是这样:
第一行内容 第二行内容 ... 第十行内容
方便的话把它放到JMeter的bin文件夹里,这样后面调用的时候直接写文件名就行,省得输一堆绝对路径;要是不想放这儿,就记好它的完整路径,比如D:\test\Perf_EC.csv。
2. 配置线程组
在测试计划里加个线程组,然后这么设置:
- 线程数:填
10——刚好对应你的CSV行数,保证每个线程能分到一行 - 循环次数:设为
1——每个线程只跑一次,读完一行就结束 - Ramp-Up时间:如果想让所有线程同时启动就设
0,要是想分批启动就按需求调,比如1秒启动所有线程也行
3. 用CSVRead()读取内容
在你需要用到CSV内容的地方(比如HTTP请求的参数、BeanShell脚本里),直接插这个函数:
${__CSVRead(Perf_EC.csv,0)}
解释下参数:
- 第一个参数是CSV的路径,刚才放bin目录就直接写文件名,不然就写绝对路径
- 第二个参数
0是列索引,因为你是单列,JMeter的列索引从0开始,所以就用0
4. 跑起来验证
启动测试后,10个线程会按你设置的方式启动,每个线程都会读取CSV里的一行,而且不会重复读——CSVRead函数默认就是按顺序给每个线程/循环分配行的。等所有线程都跑完一次循环,测试就自动停了,刚好把10行都读完。
额外小技巧:线程数比CSV行数多怎么办?
要是你设置的线程数比CSV行数多,想让文件读完就自动停线程,可以结合If Controller来搞:
- 加个If Controller,条件写:
${__jexl3("${__CSVRead(Perf_EC.csv,0)}" != "EOF",)} - 把需要执行的取样器都放到这个控制器下面
- 等CSV读到最后一行,函数会返回
EOF,这时候If Controller就不会再执行里面的内容,线程也就自然停了
这样配置完,就完全符合你要的“每个线程读一行,文件读完就停线程”的需求啦!
内容的提问来源于stack exchange,提问作者Alex Le
相关产品推荐
相关产品推荐

