访问JMeter脚本路径

15

是否有一种通过变量/属性访问当前脚本的绝对物理路径的方法? 似乎在Debug Sampler中没有列出任何内容。

加载CSV文件和JMX包含等操作使用当前工作目录作为其相对路径非常令人恼火。

4个回答

20

我使用了haridsv提供的答案,它非常好用,但是我需要将JMX文件的目录放入一个变量中。我创建了一个“用户定义变量”组件,并在变量的“值”字段中使用了BeanShell,如下所示:

${__BeanShell(import org.apache.jmeter.services.FileServer; FileServer.getFileServer().getBaseDir();)}${__BeanShell(File.separator,)}

第一个BeanShell部分调用获取目录的Java类。第二个部分将文件分隔符附加到路径中,当然这是可选的。


1
这在GUI、非GUI和所有组件中都可以工作,而不需要在配置或参数方面进行混乱的操作。 - KCD
仅供记录:此解决方案的一个影响(至少对我测试过的3.2版本而言)是,由于某种原因,报告文件不再有覆盖警告(自动执行附加)。 - Marinos An

10
  • 包含控制器
    根据组件参考文档:

    此元素不支持文件名字段中的变量/函数。
    但是,如果定义了属性 includecontroller.prefix,则使用内容作为路径名的前缀。如果在 prefix + filename 指定的位置找不到文件,则控制器尝试相对于 JMX 启动目录(2.3.4 版本之后的 JMeter 版本)打开 fileName。

    您可以向 JMeter 传递名为 includecontroller.prefix 的 Java 属性,该属性可用于在包括的 JMX 文件之前添加目录。

    1) 在控制台启动时使用:

    -Jincludecontroller.prefix=/full/path/to/jmx/scripts/dir/

    2) 在 GUI 中 - 添加到 .sh/.cmd/.bat 文件或编写包装文件;
    3) 在Jmeter Ant 任务使用情况下 - 设置为单独的属性:

    <jmeter 
    jmeterhome="${jmeter.home}" 
    testplan="..." 
    resultlog="...">
        <property name="jmeter.save.saveservice.assertion_results" value="all"/>
        <property name="jmeter.save.saveservice.output_format" value="xml"/>
        <b><property name="includecontroller.prefix" value="..."/></b>
    </jmeter>
    
  • CSV Data Set Config
    根据组件参考文档:

    相对文件名是相对于当前测试计划的路径解析的。
    也支持绝对文件名,但请注意,除非远程服务器具有相同的目录结构,否则它们不太可能在远程模式下起作用。 如果以两种不同的方式引用同一个物理文件,例如csvdata.txt和./csvdata.txt,则这些被视为不同的文件。如果操作系统区分大小写,则csvData.TXT将被单独打开。


    您可以声明一个测试计划变量,该变量使用包含csv数据文件的文件夹检索参数值:
    例如:

    csv.path | ${__P(csv.path, ${__property(user.dir)}${__BeanShell(File.separator,)})} 

    CSV Data Set Config
    Filename = ${csv.path}${__P(users-list,)}
    

    从控制台进行设置:

    -Jcsv.path=/full/path/to/csv/data/dir/

    分布式测试设置的设置:

    -Gcsv.path=/full/path/to/csv/data/dir/

感谢您的详细回答,Alies。在GUI中以“调试”方式运行时,这是如何工作的? - Richard Szalay
感谢提供文档参考。我之前有些困惑,因为日志输出表明使用了JMeter主目录路径;但是,如果JMX相对路径正确,它将能够正常工作。 - Richard Szalay

8
通过说“当前脚本的绝对物理路径”,我猜想OP是指加载测试计划(jmx文件)的位置。我需要确切地从BeanShell脚本中生成CSV文件,在运行开始时,它随后用于CSV数据集配置以进行读取,因此我希望脚本能像后者在未指定路径时那样工作。我查看了JMeter源代码并找到了这个可行的解决方案:
import org.apache.jmeter.services.FileServer;
log.info(FileServer.getFileServer().getBaseDir());

我测试过,发现在jmeter.log中显示了正确的路径。


3

我的问题是,我的相对路径Include Controller包含反斜杠,在Linux和OSX上出现了错误。

解决方案是在相对路径中使用正斜杠,这在所有平台上都有效。


1
谢谢。在JMeter脚本中,您还可以使用${__BeanShell(File.separator,)}来设置所有路径-这也将使它们独立于平台。 - Aliaksandr Belik
@AliesBelik - 我会记住的,但是针对这种情况,包含控制器不支持变量(根据您的答案)。 - Richard Szalay
这些命令确切地是什么意思?${__BeanShell(Name_Of_BeanShell_Script)}。我在我的jMeter项目中有一个beanshell脚本,我想在发送请求之前只使用其中一个。我应该在BeanShell预处理器命令中使用${__BeanShell(Name_of_my_script)}吗? - Marcin Erbel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接