我正在学习使用jmeter(第一次)对我们的地理空间postgres(postgis)数据库进行一些性能测试。我想使用JDBC Request sampler sql查询来连续命中数据库,但是我需要更改查询中的时间戳,问题是它们不是正常参数,它们在函数调用中的字符串内。
SELECT int_temp_f,
observed_utc,
encode(ST_AsBinary(ST_Force_2D("geometry_4326"),'NDR'),'hex') AS geom,
"ogc_featureid"
FROM fn_surfaceobs_temperature(ST_GeomFromText('POLYGON((-180 -90,-180 90,180 90,180 -90,-180 -90))',4326),
NULL,
0,
'latest',
'observed >= ''2015-06-08 14:00:00Z'' AND observed < ''2015-06-09 15:00:00Z'' ',
TRUE)
WHERE (geometry_4326 && ST_GeomFromText('POLYGON((-180 -90,-180 90,180 90,180 -90,-180 -90))',4326))
ORDER BY COALESCE(priority,0) DESC, observed DESC;
如何使用jmeter变量替换字符串中的用户定义?
'observed >= ''2015-06-08 14:00:00Z'' AND observed < ''2015-06-09 15:00:00Z'' ',
我想做这样的事情:
'observed >= ''${start_timestamp}'' AND observed < ''${end_timestamp}'' ',
这甚至可能吗?
最终,我想将时间戳更新为“今天”。但是在研究了如何在正常的SQL替换情况下执行timestamp变量后,我认为我现在可以安排将时间戳替换为用户定义的变量。
答案 0 :(得分:1)
您确实可以在JDBC查询中使用jmeter变量。
SELECT int_temp_f,
observed_utc,
encode(ST_AsBinary(ST_Force_2D("geometry_4326"),'NDR'),'hex') AS geom,
"ogc_featureid"
FROM fn_surfaceobs_temperature(ST_GeomFromText('POLYGON((-180 -90,-180 90,180 90,180 -90,-180 -90))',4326),
NULL,
0,
'latest',
'observed >= ''${StartDate}'' AND observed < ''${EndDateHour}'' ',
TRUE)
WHERE (geometry_4326 && ST_GeomFromText('POLYGON((-180 -90,-180 90,180 90,180 -90,-180 -90))',4326))
ORDER BY COALESCE(priority,0) DESC, observed DESC;
这里的技巧是获得有效的时间戳。正如上面指出的RaGe,beanShell就是答案。
您可以创建一个简单的用户指定变量,如下所示:
${__BeanShell(new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()))}
或者在我的情况下,我需要对时间戳做一些额外的修改,所以我创建了一个beanshell预处理器。 https://stackoverflow.com/a/21847313/2532408有几个解释。
以下是我的意思:
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import java.util.Calendar;
int backhour = -5
int forehour = 1
int foremin = 5
Date date = new Date();
date.setDate(date.getDate());
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssZ"); // needs to be 2015-06-09 15:00:00Z
Calendar c = Calendar.getInstance(); // get Java Calendar instance
c.setTime(date); // set Calendar time to now
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
c.add(Calendar.HOUR, backhour); // add -X hours
df.setTimeZone(TimeZone.getTimeZone("UTC")); // set the dateformat to use UTC
String startDate = df.format(c.getTime()); //create string of calendar object
vars.put("StartDate",startDate); // set the jmeter var to StartDate
//set the next var 1 hour ahead
c.add(Calendar.HOUR, forehour); // add 1 hour
String endDateHour = df.format(c.getTime()); //create string of calendar object
vars.put("EndDateHour",endDateHour); // set the jmeter var to EndDate
c.add(Calendar.HOUR, -forehour); // minus the hour so we can resuse c
答案 1 :(得分:1)
您可以在SQL查询中使用JMeter的__time()函数,它以SimpleDataFormat模式控制的形式返回当前日期。