JMeter如何基于列值读取CSV中关联用户的特定行数据?
解决JMeter单CSV按关联用户筛选读取患者数据的方案
1. 配置医生账号CSV读取(CSV1)
在Thread Group下添加CSV Data Set Config,配置如下:
- 文件名:指向存储医生登录名和密码的CSV1路径
- 变量名称:
loginName,password(对应CSV列名) - 分隔符:
, - 共享模式:
All threads - 循环次数:
1
这样每个线程(4个外科医生用户)会自动获取唯一的一行账号数据。
2. 预加载患者数据并按loginName分组(CSV2)
添加Setup Thread Group(仅在测试开始前执行一次),在其中添加JSR223 Sampler,使用Groovy代码读取CSV2并按loginName分组存储到全局属性:
import groovy.json.JsonBuilder import java.nio.file.Files import java.nio.file.Paths def csvPath = "path/to/your/patients.csv" // 替换为CSV2实际路径 def patientsByLogin = [:].withDefault { [] } // 读取CSV内容,跳过表头 Files.lines(Paths.get(csvPath)).skip(1).each { line -> def parts = line.split(",") def patient = [ PatientName: parts[0], PatientId: parts[1], loginName: parts[2] ] patientsByLogin[parts[2]] << patient } // 将分组数据转为JSON字符串存入全局属性,方便线程读取 props.put("patientsByLogin", new JsonBuilder(patientsByLogin).toString())
3. 线程内获取当前用户的患者列表并遍历
在Thread Group的登录请求之后、Runtime Controller内部,添加以下组件:
3.1 JSR223 Sampler:获取当前用户的患者列表
将全局属性中存储的分组数据取出,筛选出当前线程loginName对应的患者列表,存入线程局部变量:
import groovy.json.JsonSlurper def patientsByLogin = new JsonSlurper().parseText(props.get("patientsByLogin")) def currentPatients = patientsByLogin[vars.get("loginName")] // 将患者列表存入线程变量,方便后续循环使用 vars.putObject("currentPatients", currentPatients) // 初始化遍历计数器 vars.put("patientIndex", "0")
3.2 While Loop:遍历患者仪表盘
设置While Loop的条件为:${__jexl3(${patientIndex} < ${__groovy(vars.getObject('currentPatients').size(),)},)}
在Loop内部依次添加:
- JSR223 Sampler:取出当前索引的患者数据
def patients = vars.getObject("currentPatients") def index = vars.get("patientIndex") as int def currentPatient = patients[index] // 将患者信息存入线程变量,供后续请求使用 vars.put("PatientName", currentPatient.PatientName) vars.put("PatientId", currentPatient.PatientId) - HTTP请求:访问患者仪表盘,使用
${PatientId}等变量填充请求参数 - JSR223 Sampler:递增计数器
def index = vars.get("patientIndex") as int vars.put("patientIndex", String.valueOf(index + 1))
4. 后续清理与登出
在While Loop结束后添加登出请求,完成整个用户流程。
关键说明
- 预加载分组的方式避免了每个线程重复读取CSV文件,提升测试性能
- 使用Groovy处理数据效率远高于JMeter内置函数,适合复杂数据筛选场景
- 全局属性
props用于跨线程共享数据,线程局部变量vars存储当前线程专属数据,避免并发冲突
内容的提问来源于stack exchange,提问作者Tara
相关产品推荐
相关产品推荐

