我在JMeter测试计划中定义了正则表达式,并且能够在user.variables中捕获简单变量中的值。但是我正在尝试在 Beanshell 后处理器中计算两个变量之间的时间差,如下所示,但我的报告中没有得到任何结果。
import javax.xml.bind.DatatypeConverter;
vars.put("old_date_submitted", "submittedDate"); // submittedDate, succeeddedDate and runningDates are regular expr. reference names
vars.put("old_date_succeeded", "succeededDate");
vars.put("old_date_running", "runningDate");
Calendar cal_s = DatatypeConverter.parseDateTime(vars.get("old_date_submitted"));
Calendar cal_c = DatatypeConverter.parseDateTime(vars.get("old_date_succeeded"));
Calendar cal_r = DatatypeConverter.parseDateTime(vars.get("old_date_running"));
Date new_date1 = cal_s.getTime(); // submitted Time
Date new_date2 = cal_c.getTime(); // succeeded Time
Date new_date3 = cal_r.getTime(); // running Time
long new_date1_ms = new_date1.getTime(); // submitted Time
long new_date2_ms = new_date2.getTime();
long new_date3_ms = new_date3.getTime();
log.info("Date in milliseconds: " + new_date1_ms);
long delta1 = new_date2_ms - new_date1_ms; //calculate the difference (succeededDate - submittedDate)
long delta2 = new_date3_ms - new_date1_ms; //calculate the difference (runningDate - submittedDate)
vars.put("delta1", String.valueOf("delta1")); // store the result into a JMeter Variable
vars.put("delta2", String.valueOf("delta2")); // store the result into a JMeter Variable
这个位:
vars.put("old_date_submitted", "submittedDate"); // submittedDate, succeeddedDate and runningDates are regular expr. reference names
vars.put("old_date_succeeded", "succeededDate");
vars.put("old_date_running", "runningDate");
对我来说似乎很奇怪。鉴于:
提交日期、成功日期和运行日期是常规表达式。 引用名称
我的期望是你应该在那里使用 JMeter 变量而不是硬编码的字符串,所以你应该将代码更改为如下所示:
vars.put("old_date_submitted", vars.get("submittedDate")); // submittedDate, succeeddedDate and runningDates are regular expr. reference names
vars.put("old_date_succeeded", vars.get("succeededDate"));
vars.put("old_date_running", vars.get("runningDate"));
所以很可能你的代码在DatatypeConverter.parseDateTime
失败了。
下次遇到 Beanshell 脚本的任何问题时,请考虑以下故障排除技术:
- 检查 jmeter.log 文件 - 如果 Beanshell 脚本失败,错误将打印在那里
- 将
debug();
指令添加到 Beanshell 脚本的最开头 - 它将触发调试输出到 stdout 把你的 Beanshell 代码放在 try/catch 块中,如下所示:
try { //your code here } catch (Throwable ex) { log.error("Something went wrong", ex); throw ex; }
通过这种方式,您可以获得更多"人性化"的堆栈跟踪打印到 jmeter.log 文件。
请参阅如何使用 BeanShell:JMeter 最喜欢的内置组件指南,了解有关在 JMeter 测试中使用 Beanshell 的更多信息。