${__time} 函数输出不正确

${__time} function output is incorrect

我试图在 BeanShell 后处理器中使用格式为“${__time(yyyy-MM-dd)}”的 jmeter 时间函数获取今天的日期。但在执行 Beanshell 后处理器后,结果显示为“1996”。基本上 "time" 函数通过减去“2018-03-19”=1996 等值来显示结果。 请帮助我解决此问题,以便我可以获得当前日期和时间。 豆壳代码如下

 import org.apache.jmeter.gui.GuiPackage;
import org.apache.commons.io.FilenameUtils;

String testPlanFile = GuiPackage.getInstance().getTestPlanFile();
String testPlanFileDir = FilenameUtils.getFullPathNoEndSeparator(testPlanFile);
vars.put("testPlanFileDir", testPlanFileDir);
//create the file in test plan file dir and print current time and Date

FileOutputStream f = new FileOutputStream(testPlanFileDir+"/CurrentDate.txt", true);
PrintStream p = new PrintStream(f); 
this.interpreter.setOut(p); 
//current date and time;
print("Current date is:"+${__time(yyyy-MM-dd)});
f.close();

您应该根据 JMeter 移动到 JSR223 后处理器 Best Practices:

Since JMeter 3.1, we advise switching from BeanShell to JSR223 Test Elements

在那之前你可以通过引用函数调用来修复它

  print("Current date is:"+"${__time(yyyy-MM-dd)})";

此修复会将函数的 return 值视为字符串。 目前它将其视为数字减法:2018-3-19=1996,然后将其转换为字符串

将时间函数调用设置为预处理器的参数(顺便迁移到 JSR223 + Groovy 以提高性能)

然后将其与变量 Parameters:

一起使用

  1. 性能anti-pattern#1:假定您使用GuiPackage class you won't be able to execute your test in non-GUI mode, consider migrating to FileServer代替
  2. 性能anti-pattern #2:不推荐使用Beanshell,因为在高负载的情况下它可能成为瓶颈。因为 JMeter 3.1 it is recommended to use JSR223 Test Elements and Groovy language 任何形式的脚本
  3. 性能 anti-pattern #3:不要在脚本主体中内联 JMeter Variables or Functions 它们会破坏 Groovy 已编译脚本的缓存功能,并可能解析为会导致意外行为的内容(例如你的情况),编译失败甚至数据丢失。

所以:

  • 添加 JSR223 PostProcessor 而不是 Beanshell
  • 将以下代码放入"Script"区域:

    String testPlanDir = org.apache.jmeter.services.FileServer.getFileServer().getBaseDir()
    File currentDate = new File(testPlanDir + File.separator + "CurrentDate.txt") 
    currentDate << new Date().format("yyyy-MM-dd")
    

尝试使用 JSR223 后处理器 和语言 Groovy 并将其放入脚本区域:

def a = new Date().format('yyyy-MM-dd')
new File('Example.txt').withWriter('utf-8') { 
         writer -> writer.writeLine 'Current date is : ' + a.toString() }

(适用于 JMeter 4.0