JMeter 线程重复读取在跑数据的解决方法
场景:
需要模拟 100 个账号,100个并发,循环登录登出系统;由此引起了一个问题,如果线程10比线程1提前结束,那么线程10会按 cvs 顺序读取,就有可以读取到目前还在其他线程里面的一个账号;
就会出现两个线程登录同一个账号的情况。
当A线程用User1登录,B线程再用User1登录,这个时候A线程用User1登出,就会发现登录的时候验证 token 错误(已经被线程B的登录0覆盖)
处理方式:2种
处理方式1:常规的 CSV Data Set Config 设置,如果需要用 100 个并发去验证,则需要用1000个账号去遍历,减少出现不同线程读取到同一个账号。

处理方式2:固定线程1 读取 csv 第1 个账号,线程2 读取 csv 第2 个账号.... 线程100 读取 csv 第100 个账号
1、获取当前线程的线程编号
在 Thread Group 下创建一个 User Parameters,详情如图:
Thread Group(右键)- Add - Pre Processors - User Parameters
点击:Add Variable ,填入:threadNum(变量名称) ${__threadNum} (JMeter 获取线程的变量)

2、创建一个脚本,根据线程编号读取文件指定行
在 Thread Group 下创建一个 BeanShell PreProcessor,详情如图:
Thread Group(右键)- Add - Pre Processors - BeanShell PreProcessor
Script 填入下面脚本内容,就可以通过 ${userName}, ${password} 引用这两个变量。
注:里面所引入的类都是 JMeter 的 lib 就自带的。
import java.io.File; import java.util.List; import org.apache.commons.io.FileUtils; try { String path = "D:\account.csv"; File file = new File(path); //log.info("userCsvPath:" + file.getAbsolutePath());
List lines = FileUtils.readLines(file, "UTF-8"); int threadNum = Integer.parseInt(vars.get("threadNum")); String line = lines.get(threadNum); //log.info("############### Thread " + threadNum + " - User=" + line); // loginName,password String[] cols = line.split(","); vars.put("loginName", cols[0]); vars.put("password", cols[1]); }catch (Exception e) { log.info("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ FileUtils.readLines() error", e); }

浙公网安备 33010602011771号