找回密码
 立即注册
首页 业界区 安全 JMeter 线程重复读取在跑数据的解决方法

JMeter 线程重复读取在跑数据的解决方法

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

 
处理方式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.png

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

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册