我需要捕获JMeterLoad测试的StartTime(格式:2021-04-28T12:09:09000009(、EndTime(格式为:2021-04-2 8T12:09:09 000009(和测试持续时间(毫秒(。我计划在Jsr223Sampler中的SetupThreadGroup中捕获StartTime(格式:2021-04-28T12:09:09000009(和EndTime;tearDownThreadGroup中的持续时间,使用以下代码。
---设置线程
def now = new Date()
def starttime = now.format("yyyy-MM-dd'T'HH:mm:ss.ssssss", TimeZone.getTimeZone('UTC'))
vars.put("StartTime", starttime)
---TearDownThreadGroup
def now = new Date()
def endtime = now.format("yyyy-MM-dd'T'HH:mm:ss.ssssss", TimeZone.getTimeZone('UTC'))
vars.put("EndTime", endtime)
def diff = vars.get("StartTime")-endtime
低于错误
2021-04-28 18:17:11,475 ERROR o.a.j.p.j.s.JSR223Sampler: Problem in JSR223 script GetEndTime_Duration, message: javax.script.ScriptException: java.lang.NullPointerException: Cannot invoke method minus() on null object
javax.script.ScriptException: java.lang.NullPointerException: Cannot invoke method minus() on null object
您已经在变量TESTSTART.MS
中保存了开始时间,您可以在脚本中使用它,例如
long starttime = Long.valueOf(vars.get("TESTSTART.MS"))
def now = new Date()
def endtime = now.format("yyyy-MM-dd'T'HH:mm:ss.ssssss", TimeZone.getTimeZone('UTC'))
vars.put("EndTime", endtime)
def diff = now.getTime() - starttime
log.info String.valueOf(diff)
您的脚本存在多个问题:
-
您使用的是代表JMeterVariables类实例的
vars
简写,根据JMeter文档属性与变量不同变量是线程的本地变量;属性对所有线程都是通用的,需要使用__P或__property函数来引用
因此您应该使用
props
而不是vars
,请参阅Groovy应该使用的前8个JMeter Java类,以了解有关这些人手不足的的更多信息 -
您正在减去2个字符串
-
您正在从较低值(开始时间(中减去较大值(结束时间(
我的期望是,在设置线程组中,您应该使用以下代码:
def starttime = System.currentTimeMillis()
props.put("StartTime", starttime)
和在拆卸线程组中:
def endtime = System.currentTimeMillis()
def diff = endtime - props.get('StartTime')
log.info('Diff: ' + diff)