You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 16:25:15