Loading

JMeter:用 JSR223 Groovy 提取变量并生成 CSV

JMeter:用 JSR223 Groovy 提取变量并生成 CSV

场景:一个线程组内包含多个取样器,只执行一次,将多个提取的变量横向写入 CSV,方便后续线程组或外部程序读取。


一、场景

  • 单线程组、仅执行一次(如 Once Only Controller)
  • 多个取样器分别提取了不同变量,想把它们横向汇总成一行 CSV
  • 生成的 CSV 供「CSV Data Set Config」或其他线程组复用
  • 提取的文本不含逗号、换行、双引号等特殊字符

二、demo

在 JMeter 中添加 JSR223 SamplerJSR223 PostProcessor,选择 groovy

// 1. 填入前面提取出来的变量名(有几个写几个,顺序决定了列的顺序)
def variableNames = ["var1", "var2", "var3"] 

// 2. 收集每变量对应值
def rowValues = []

variableNames.each { name ->
    def value = vars.get(name)
    // 过滤空值,以及正则没匹配到时产生的原始字符串 "${变量名}"
    if (value != null && !value.trim().isEmpty() && !value.startsWith('${')) {
        rowValues.add(value.trim())
    } else {
        rowValues.add("") // 变量没提取到,留空,保证列对齐
    }
}

// 3. 设置输出路径(txt逗号分隔)
def filePath = "D:/jmeter_results/next_group_input.txt"
def file = new File(filePath)

if (!file.parentFile.exists()) file.parentFile.mkdirs()

// 4. 写入文件:第一行变量名,第二行对应值,逗号分隔
file.withWriter('UTF-8') { writer ->
    writer.writeLine(variableNames.join(","))
    writer.writeLine(rowValues.join(","))
}

log.info("======= 数据已写入:${filePath} =======")

三、说明

步骤 作用
variableNames 定义需要汇总的变量名列表,顺序决定 CSV 的列顺序
vars.get(name) 获取 JMeter 变量值,vars 是 JSR223 内置对象
空值/占位符过滤 正则提取失败时,避免 ${var1} 这类字符串污染数据
mkdirs() 路径不存在则创建
withWriter('UTF-8') 覆写,每次执行会替换旧文件
log.info(...) 在 JMeter 日志中打印成功信息

四、生成结果示例

假设 var1=applevar2=bananavar3=(未提取到),生成的 CSV:

var1,var2,var3
apple,banana,

用 Excel 打开即为一个整齐的表格:

var1 var2 var3
apple banana

五、多线程/追加?

后续每次迭代追加一行可改用:

// 追加模式
file.withWriterAppend('UTF-8') { writer ->
    writer.writeLine(rowValues.join(","))
}

但多线程追加存在文件锁问题,考虑 JMeter 原生的 Simple Data WriterFlexible File Writer


posted @ 2026-06-26 00:29  夷某蓁  阅读(32)  评论(0)    收藏  举报