本文共 5580 字,大约阅读时间需要 18 分钟。
前言:
在进行Jmeter功能、性能、接口测试时,经常会用到时间戳函数,本文将对时间戳的常用函数做一次基础的汇总。
1、时间戳格式转日期格式:
BeanShell Sampler方式实现
import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;//10位的秒级时间戳long time1 = 1586050845;String result1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(time1 * 1000));vars.put("result1",result1);//13位的毫秒级时间戳long time2 = 1588749008549L;String Tresult2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(time2));vars.put("Tresult2",Tresult2);return Tresult2;//注意:long型需要再后面加“L”,否则会报错。
2、日期格式转时间戳格式:
背景:
日期转时间戳格式相对来说要复杂一些,网络上没有现成的技术文档(至少截至发稿前未找到),于是尝试使用java实现,自己写实现类,之后导出jar包到jmeter>lib>ext中,之后在jmeter Beanshell中做调用。
场景:
有些参数实现时,要求时间戳是13位毫秒级,但是秒数又要求是00,例如:2020-05-14 14:30:00,不能是2020-05-14 14:30:32(开发策略,数据库会把32秒自动重置为00)所以在进行日期转换时,如果取的是当前的时间 ${__time(,)} ,必然会带有秒数,因此在获取时间戳时,我们要自动精确到 年-月-日:时-分,如:__time(yyyy-MM-dd HH:mm,time),这样转时间戳转换后的秒数,自然就是00了。
具体案例参考如下:
娇娇在一家教育公司做接口测试,某天接到需求,编写一个脚本用来实现即时开课功能,方便其他小伙伴直接调用,用以减少人工开课的时间成本。
需求如下:
娇娇拿到需求后,直接使用 __time(,) 函数做为开课时间进行开课,结果发现老师开课后无法添加学生到教室,后经过排查发现是因为数据库写死了,只能读取时间戳到整秒,秒数自动重置为00'',此时的现象是,教室开课时间是2020-05-14 13:05:32,数据库存储时间是2020-05-14 13:05:00,通过接口提取的结果树里的时间是2020-05-14 13:05:32(数据库直接查询开课时间不在本次讨论范围),所以因为时间戳不相等导致无法添加学生进教室。于是娇娇重新调整参数,用到了以下的方法实现:
1)使用 java编写脚本,实现日期格式转时间戳功能,代码如下:
package com;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;public class Test00{ public static void main(String[] args) throws Exception{ SimpleDateFormat time=new SimpleDateFormat("yyyy-MM-dd HH:mm"); String newTime = time.format(new Date()); System.out.println("newTime:"+newTime); System.out.println("dateToStamp(newTime):"+dateToStamp(newTime)); } //将时间转换为时间戳 public static String dateToStamp(String s) throws ParseException { String res; SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm"); Date date = simpleDateFormat.parse(s); long ts = date.getTime(); res = String.valueOf(ts); return res; }}
2)脚本写好后导出为jar包,放到jmeter>lib>ext目录
3)Jmeter使用Beanshell方式引入jar包。
import com.*;String time = "${__time(yyyy-MM-dd HH:mm,time)}";String newTime=Test00.dateToStamp(time);vars.put("nowstartTime",newTime);return newTime;
查看结果树:
此时,我们实现了精确到 “yyyy-MM-dd HH:mm”的日期格式,秒数自动为00'',获取的时间戳为 1589361000000,满足使用条件,http请求中直接引入变量 ${nowstartTime} 即可。
在使用jmeter做接口测试的时候,经常会要用到日期函数,让系统自动生成一些格式化的数据,方便接口测试,jmeter自身就带有时间戳的函数
1、__time():获取时间戳、格式化时间
(1)${__time(yyyy-MM-dd HH:mm:ss:SSS,time)} :格式化生成时间格式 2018-10-26 11:08:23:635
(2)${__time(yyyy-MM-dd HH:mm:ss,time)} :格式化生成时间格式 2018-10-26 11:08:23
(3)${__time(,)} :默认该公式精确到 毫秒 级别, 13位数 1527822855323
(4)${__time(/1000,)} :该公式精确到 秒 级别, 10位数 1527822871
(5)${__time(yyyy-MM-dd,)} : 该公式格式化生成的常规时间为:2018-10-26
(6)${__time(yyMMdd,)} : 该公式格式化生成的时间为:181026
2、__timeShift(格式,日期,移位,语言环境,变量)函数,可以将时间进行移位,对当前时间增加或者减少对应的时间
(1)格式 - 将显示创建日期的格式。如果该值未被传递,则以毫秒为单位创建日期。
(2)日期 - 这是日期值。用于如果要通过添加或减去特定天数,小时或分钟来创建特定日期的情况。如果参数值未通过,则使用当前日期。
(3)移位 - 表示要从日期参数的值中添加或减去多少天,几小时或几分钟。如果该值未被传递,则不会将任何值减去或添加到日期参数的值中。
“P1DT2H4M5S” 解析为“添加1天2小时4分钟5秒” “P-6H3M”解析为“-6小时+3分钟” “-P6H3M”解析为“-6小时-3分钟” “-P-6H + 3M”解析为“+6小时和-3分钟”
(4)、区域设置 - 设置创建日期的显示语言。不是必填项
(5)、变量 - 创建日期的值将被分配给的变量的名称。不是必填项
e.g:${__timeShift(yy-MM-dd,2018-10-26,P2D,,)}这种返回的时间就是2018-10-28
3、__randomDate(格式,开始时间,结束时间):时间段内随机获取时间
(1)格式默认为yyyy-MM-dd
e.g:${__randomDate(yyyy-MM-dd,2018-10-01,2018-10-30)},这种函数就会自动返回20181001-20181030之间的一个日期。
对于时间的获取,除打印当前时间,还会打印明天,后台,甚至是明年的时间,那么我们仍然需要用到Beanshell方式。
1、添加 BeanShell Sampler
线程组-->添加-->Sampler-->BeanShell Sampler
2、编写java脚本
代码如下:
import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;try{ Date date =new Date(); //获取当前时间 SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String nowDate = sf.format(date); Calendar cal = Calendar.getInstance(); cal.setTime(sf.parse(nowDate)); cal.add(Calendar.DAY_OF_YEAR,+10); //此处+0为当前时间,+10为加10天,-10为当前时间减10天,类推 String orderDate = sf.format(cal.getTime()); cal.add(Calendar.DAY_OF_YEAR,+365); //在之前的时间变量基础上,1为一天,365为一年 String senderDate = sf.format(cal.getTime()); //传递两个变量,orderDate & senderDate ,也可以传递多个变量 vars.put("orderDate",orderDate); vars.put("senderDate",senderDate); } catch(Exception e){ }
3、添加Http请求,验证时间戳数据
其中 orderDate 和 senderDate 变量为Beanshell定义好的,如果需要更多的时间偏移,可以定义更多的,可以实现提前N天和延后M天。
当前时间 &当前时间 - 1天 & 当前时间+365天
获取一小时之前的时间戳:
显示秒级别: ${__intSum(${__time(/1000,)},-3600,)} //显示10分钟之前时间 ${__intSum(${__time(/1000,)},-600,)}显示毫秒级: ${__longSum(${__time},-3600000,)} //显示10分钟之前时间 ${__intSum(${__time(/1000,)},600000,)}
获取一小时之后的时间戳:
显示秒级别: ${__intSum(${__time(/1000,)},3600,)} //显示10分钟之后时间 ${__intSum(${__time(/1000,)},600,)}显示毫秒级: ${__longSum(${__time},3600000,)} //显示10分钟之后时间 ${__intSum(${__time(/1000,)},600000,)}
应用场景1:
应用场景2:
随机延长或缩短不同时间,制造不同时间点数据,便于实现并发。
当前时间:1583846434000 2020-03-10 21:20:34
延后时间:1583847118438 2020-03-10 21:31:58
${__longSum(${__time},${__Random(300000,900000,)},)} 5-15分钟
${__Random(300000,900000,)} //添加的随机数,出现重复随机数的概率会有,但是组合上时间值之后,重复概率就特别小了,因为gettime()是毫秒级,并且始终在计时。
${startTime} ${__longSum(${startTime},${__Random(300000,900000,)},)} 5-15分钟 ${__longSum(${startTime},300000,)}
综上所述,基于常用的时间戳使用函数基本可以覆盖当前大部分的使用场景,其中有一部分是在网上收集整理,并非原创,旨在方便大家使用,如有侵权请联系删除!
转载地址:http://oguhp.baihongyu.com/