场景:
需要模拟 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[0]);
- vars.put("password", cols[1]);
- }catch (Exception e) {
- log.info("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ FileUtils.readLines() error", e);
- }
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |