【问题标题】:JMeter tests in Non-GUI mode are not trustworthy非 GUI 模式下的 JMeter 测试不可信
【发布时间】:2018-06-26 17:19:28
【问题描述】:

GUI 上的测试脚本完美运行,但在非 GUI 模式下却不行。Image showing Terminal test execution

说明: 我在测试计划中有 3 个线程组,其中第一个 Thread Group 创建了 3 个 .csv 文件,并预计将 CSV 文件中的数据提供给 second Thread Group

对于少数测试运行,非 GUI 模式工作得很好,但是,像这样 [终端显示测试运行] 的测试间歇性地不会创建 CSV 文件,而且, 有时,第三个线程组根本不执行。

T他的问题我注意到的是:

  1. 在非 GUI 测试期间,文件没有被创建,这就是下一个线程组无法获取和使用 CSV 文件中的变量以及

  2. 第二个可能是:我将文件夹和文件路径保存在 ${__setProperty(prop_folder_Path,${File_Path})} 并获取道具。 ${__property(prop_folder_Path)} 在另一个线程组中 -> 有时此属性函数不起作用,文件保存在 /bin 目录中

    有没有办法在 BeanShell POSTProcessor 中使用 ${__property(prop_folder_Path)} 值?

我相信任何在 GUI 中有效的东西在非 GUI 中也应该同样有效,对吗?

我刚刚注意到在非 GUI 中运行测试时在 /bin 文件夹as shown here 中创建了输出文件

任何解决此问题的建议。谢谢

【问题讨论】:

  • 在提供的信息如此之少的情况下,您希望如何获得有用的答案?
  • 如果您有兴趣回答,我已经编辑了帖子。谢谢
  • 从您的最新解释看来,您的脚本中有一些相对路径(例如,您指定了文件名,但没有指定文件路径)。您永远不应该在自动化中使用相对路径,因为它与当前系统路径相关并且不可靠。始终在当前交互用户和以非交互方式启动工具的用户(不总是同一个用户)都具有权限的文件夹中提供绝对路径。例如。不是用户的主目录...
  • @Kiril S 感谢您的回顾和您的回复:这就是我设计路径的方式import org.apache.jmeter.services.FileServer; //gets path of current jmeter's script String path = FileServer.getFileServer().getBaseDir()+File.separator+"Output"; File f = new File(path ); f.mkdirs(); vars.put("v_folder_path",path); 我附加了路径 + file.separator + "new_file_name.csv" 我相信这可以减少手动工作并且易于追踪。我已经执行了相当多的测试运行并且它们是成功的。,
  • 嗯我不认为你的假设'//gets path of current jmeter's script'是正确的。查看代码,FileServer.getFileServer().getBaseDir() 默认情况下与System.getProperty("user.dir") 相同,据我所知,仅由 GuiPackage 类更改为脚本路径,这可能解释了您在 gui 和非 gui 之间观察到的行为差异.但是你为什么要使用你无法控制的功能/位置呢?坚持系统默认设置不是更好吗,比如System.getProperty("java.io.tmpdir")

标签: jmeter jmeter-plugins jmeter-4.0


【解决方案1】:

我的期望是您的“.csv”文件创建在某处失败,因此第二个线程组由于缺少文件而无法运行。

JMeter 没有任何内置功能可以将某些内容写入文件,因此我认为您使用 JSR223 Scripting 实现了一些自定义逻辑,这是行不通的。原因可能在于:

  1. 如果您从另一个文件夹运行 JMeter,可以在不同的位置创建 .csv 文件,请尝试使用完整路径以防万一。
  2. 非 GUI 模式往往比 GUI 模式快,因此可能是多线程问题的情况,即当多个线程尝试同时将数据写入同一个文件并发生冲突或产生格式不正确的数据时。

在这两种情况下,答案都将存在于 jmeter.log 文件中,检查它是否有任何可疑条目并修复原因。


一般来说,使用文件在线程组之间传递数据并不是最好的主意,我建议改为在内存中进行,例如:

  1. 在第一个线程组中,使用 __setProperty() 函数将存储在 CSV 文件中的数据转换为 JMeter 属性,例如:

    ${__setProperty(foo,bar,)}
    
  2. 在第二个线程组中使用__P() function 读取数据,如:

    ${__P(foo,)}
    

更多信息:Knit One Pearl Two: How to Use Variables in Different Thread Groups

【讨论】:

  • 感谢您的评论 Dmitri T,我已经按照您解释的方式实现了相同的过程,过程是:JMeter 脚本在测试开始时在脚本位置创建一个文件夹,csv预计文件最终会在运行时创建/重写/删除。我的 GUI 测试可以正常工作,但不是在非 GUI 模式下 - 我想知道是什么导致了这个问题?我的目标是相同的 [jmx] 文件和类似的 JMeter 实例。请把 cmets 留给我为什么
  • 我使用的是 Mac,我想知道是否需要设置任何 PATH 变量。相同的脚本在 3 天前可以正常工作,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-17
  • 2018-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多