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); }

 

posted @ 2025-02-27 10:59  learcher  阅读(137)  评论(0)    收藏  举报