锺冰洁 发表于 2025-6-1 21:45:53

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());
    <br>    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);
    vars.put("password", cols);
}catch (Exception e) {
    log.info("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@FileUtils.readLines() error", e);


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: JMeter 线程重复读取在跑数据的解决方法