2012-02-07 142 views
14

有没有方法通过变量/属性访问当前脚本的绝对物理路径?似乎没有任何通过调试采样器列出的内容。访问JMeter脚本路径

令人难以置信的是,加载CSV文件和JMX Includes等操作使用当前工作目录作为其相对路径。

回答

10
  • Include Controller
    作为每个分量的参考:

    该元件不支持的文件名 场变量/函数。
    但是,如果属性includecontroller.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文件或写一个封装文件;在Jmeter Ant Task用法的情况下
    3) - 设置为单独的属性:

    <jmeter 
    jmeterhome="${jmeter.home}" 
    testplan="..." 
    resultlog="..."> 
        <property name="jmeter.save.saveservice.assertion_results" value="all"/> 
        <property name="jmeter.save.saveservice.output_format" value="xml"/> 
        <property name="includecontroller.prefix" value="..."/> 
    </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/
+0

感谢您的详细回答阿里。通过GUI在“调试”中运行时,这是如何工作的? – 2012-02-07 20:58:41

+0

感谢您的文档参考。我很困惑,因为日志输出意味着使用了JMeter主路径;但是,如果JMX相对路径正确,它将起作用。 – 2012-02-08 15:04:38

3

我的具体问题是,我的亲戚包括控制器路径包括这打破了一个反斜杠在Linux和OSX上。

解决方法是在相对路径中使用正斜杠,该斜线适用于所有平台。

+1

谢谢你。在jmeter脚本中,您还可以使用$ {__ BeanShell(File.separator,)}来设置所有路径 - 这也会使它们与平台无关。 – 2012-02-08 15:34:03

+0

@AliesBelik - 我会记住这一点,但对于这种情况,包含控制器不支持变量(根据您的答案)。 – 2012-02-08 16:21:04

+0

这些命令究竟意味着什么?$ {__ BeanShell(Name_Of_BeanShell_Script)}。我在jMeterProject中有一个beanshell脚本,我想在发送请求之前只使用其中的一个脚本。我应该在BeanShell PreProcessor命令中使用: $ {__ BeanShell(Name_of_my_script)}? – 2014-03-07 14:27:50

8

通过说“当前脚本的绝对物理路径”,我猜测OP指的是加载testplan(jmx文件)的位置。我完全需要在运行开始时从BeanShell脚本生成一个CSV文件,该文件随后在CSV数据集配置中用于回读,所以我希望脚本能够像后面的工作方式一样工作,因为没有路径时指定。我通过JMeter源代码找到了这个工作解决方案:

import org.apache.jmeter.services.FileServer; 
log.info(FileServer.getFileServer().getBaseDir()); 

我测试了这个,并在jmeter.log中看到了正确的路径。

18

我使用了haridsv提供的答案。除了我需要将目录放在JMX文件中的变量中,它运行得非常好。我做了一个“用户定义的变量”组件,使用的BeanShell在变量的“值”字段是这样的:

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

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

+1

这适用于gui,non-gui和所有组件,并且不会影响配置或参数 – KCD 2015-08-03 01:41:55

+0

仅供参考:此解决方案的效果(至少对于我测试的3.2)至少是因为某些原因报告文件的更多覆盖警告(自动执行追加) – 2017-06-27 08:18:00