Jmeter进阶·时间戳使用技巧汇总

前言:

在进行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} 即可。 

​现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】

普及篇·时间戳基础函数使用技巧

  • 初级篇·简单时间戳生成

在使用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方式获取时间戳(偏移时间戳)

对于时间的获取,除打印当前时间,还会打印明天,后台,甚至是明年的时间,那么我们仍然需要用到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,)}

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值