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

如何通过JMeter JSR223预处理器脚本访问GitHub仓库测试数据文件?

问题分析与解决方案

核心问题

  1. 语法错误:直接在new File()中使用${__P(data,"../../../../folder-a/folder-b/testData.csv")}会触发Java语法问题——__P函数返回的字符串未被引号包裹,会被解析为无效代码。
  2. 路径基准不一致:File类的相对路径基于JMeter当前工作目录(Jenkins中通常是任务工作空间根目录),而Random CSV Data Set Config自动基于JMeter脚本(.jmx)所在目录解析路径,这就是本地两种方式都生效、但Jenkins中JSR223失效的原因。

修复方案

方案1:基于脚本路径构建绝对路径(推荐)

通过JMeter API获取当前脚本的绝对路径,以此为基准构建CSV文件路径,彻底消除相对路径的不确定性。

修改后的JSR223代码:

import java.text.*;
import java.io.*;
import java.util.*;

try {
    // 获取当前JMeter脚本的绝对路径
    def testPlanFile = new File(ctx.getTestPlanFile())
    // 从脚本所在目录向上回溯4级到Base-folder
    def baseFolder = testPlanFile.getParentFile().getParentFile().getParentFile().getParentFile()
    // 构建CSV文件的绝对路径
    def csvFile = new File(baseFolder, "folder-a/folder-b/testData.csv")
    
    if (!csvFile.exists()) {
        throw new Exception ("ERROR: file not found")
    }

    BufferedReader bufRdr = new BufferedReader(new FileReader(csvFile))
    String line = null;

    while(((line = bufRdr.readLine()) != null) && (count < limit))
    {
        stl.add(line);
        count++;
    }
    bufRdr.close() // 关闭流避免资源泄漏
} catch (Exception e) {
    log.error("处理CSV文件失败: " + e.getMessage(), e)
    throw e // 抛出异常让JMeter捕获
}

方案2:修正__P函数语法(仅适用于工作目录固定场景)

若坚持用__P参数传递路径,需将参数值用引号包裹,同时确保Jenkins工作目录与脚本目录的相对关系和本地一致:

File file = new File("${__P(data,\"../../../../folder-a/folder-b/testData.csv\")}");

注意:内部双引号需用\"转义,避免与脚本外层的双引号冲突。

关键提示

  • 优先选用方案1,它不依赖JMeter工作目录,本地和Jenkins环境下都能稳定定位文件。
  • 确保stl、count、limit等变量已提前正确初始化。

内容的提问来源于stack exchange,提问作者GorkhaliHero

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 23:00:12