如何在Jmeter中获取jmeter脚本的目录

14

我有一个自定义的Java JMeter Sampler,需要传入文件位置和路径作为参数,并根据这些创建一个JSON文件以便发布到服务(基于模板文件)。由于我的脚本需要在多个目录结构不同的环境中运行,因此我需要在Sampler中使用相对路径来指向需要转换为有效JSON的文件。是否有一种方法可以在JMeter中将我的脚本所在的目录作为变量获取?我已尝试了${user.dir},但它返回的是JMeter启动的目录,而非我的脚本所在的目录。是否有其他系统属性可以参考以获取此值?如果没有,是否有人以编程方式实现了这一点?


你尝试过在https://dev59.com/0Gox5IYBdhLWcg3wf0NP中列出的解决方案吗? - user518495
1个回答

39

我之前遇到过类似的情况,需要将签名文件作为POST请求的一部分上传。这个签名文件位于与我的JMeter脚本所在文件夹结构相关的位置。

尝试使用以下BeanShell表达式(可以作为系统级别属性访问)来解析相对路径,从您的JMeter测试用例所在的位置/执行位置开始:

${__BeanShell(import org.apache.jmeter.services.FileServer; FileServer.getFileServer().getBaseDir();)}${__BeanShell(File.separator,)}
  • 您可以通过在“使用请求发送文件”字段中添加文件名来输入要发送/ POST的文件的名称。

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

  • 一个更清晰的实现方式是将其声明为变量(根据作用域是本地变量或全局变量),并在适当的字段中使用此变量。

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

    ${absolutePath}fileName.sig

注意:如果您打算将JMeter测试文件插入诸如Jenkins之类的持续集成系统,则此方法非常有用。它使您的测试案例更易于维护。


通过给定的语法(例如:C:\Users\test.xlsx),我获取了文件的路径并将其存储在变量中。但是,当我在Java I/O类文件(FileInputStream)中使用相同的变量来读取内容时,出现了错误。调试时发现反斜杠问题。无法将相同的变量传递给FileInputStream类。是否有任何方法可以将文件分隔符更改为正斜杠? - Manigandan
1
str = str.replace("\", "/"); 将字符串中的反斜杠替换为正斜杠。 - stuxnetting
...但我不知道如何将其应用于UDV,即${user.dir}。 有任何帮助来完成这个线程吗? - Franta
如果您正在运行JMeter分布式测试,请注意在Windows平台上运行JMeter分布式测试时不会提供相同的路径。 JMeter节点将报告getBaseDir()方法返回的本地路径是jmeter-server从其所在目录下启动时的路径,末尾带有一个点号(例如:“C:\ apps \ JMeter-5.3-Server \ bin \。”),而不是加载.jmx文件的路径。 - Aidan
这似乎是有效的:${__BeanShell(import org.apache.jmeter.services.FileServer; FileServer.getFileServer().getBaseDir().replace("\\\\"\, "/");)} - Moritz
显示剩余2条评论

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