如何将时间戳变量传递给 jmeter 的 JDBC 请求

How do you pass in timestamp variable into JDBC request for jmeter

我正在学习使用 jmeter(第一次)对我们的地理空间 postgres (postgis) 数据库进行一些性能测试。我想使用 JDBC 请求采样器 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}'' ',

这可能吗?

最终我想将时间戳更新为始终 'today'。但是在研究了如何在正常的 SQL 替换情况下执行时间戳变量之后,我认为我可以接受现在只需将时间戳替换为用户定义的变量。

您确实可以在 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 预处理器。 有几个解释。

这是我输入的内容:

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

您可以使用 JMeter 的 __time() function right inside your SQL query, it returns current date in the form controllable by a SimpleDataFormat 模式。