博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
long转时间 unity_Jmeter进阶·时间戳使用技巧汇总
阅读量:4955 次
发布时间:2019-06-12

本文共 5580 字,大约阅读时间需要 18 分钟。

9f14264cef2741b60914f6cf6c621320.png

前言:

在进行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”,否则会报错。

0f8d9cd1bad7a6afa5bde8bbf11e451d.png
Debug获取的参数

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编写脚本,实现日期格式转时间戳功能,代码如下:

bdc212c260e04fd64afa856ea2d4b6aa.png
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目录

5a613989e36b50369cf78b68d8ff22c7.png

3)Jmeter使用Beanshell方式引入jar包。

4e2e8f2a2b38404c0205581ddc58ebd9.png
import com.*;String time = "${__time(yyyy-MM-dd HH:mm,time)}";String newTime=Test00.dateToStamp(time);vars.put("nowstartTime",newTime);return newTime;

查看结果树:

19c03308650e53d374f55e269dd6da26.png
转换后的时间戳(13位毫秒级)

此时,我们实现了精确到 “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)、变量 - 创建日期的值将被分配给的变量的名称。不是必填项

6a5b1ed65cfe7c0b4373d744429ae04a.png

e.g:${__timeShift(yy-MM-dd,2018-10-26,P2D,,)}这种返回的时间就是2018-10-28

3、__randomDate(格式,开始时间,结束时间):时间段内随机获取时间

(1)格式默认为yyyy-MM-dd

a5b29cd49779777f94da6e54e7a44091.png

e.g:${__randomDate(yyyy-MM-dd,2018-10-01,2018-10-30)},这种函数就会自动返回20181001-20181030之间的一个日期。

  • 提升篇·Beanshell方式获取时间戳(偏移时间戳)

对于时间的获取,除打印当前时间,还会打印明天,后台,甚至是明年的时间,那么我们仍然需要用到Beanshell方式。

1、添加 BeanShell Sampler

线程组-->添加-->Sampler-->BeanShell Sampler

2、编写java脚本

10034ee2e537a904819370132aa88255.png

代码如下:

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请求,验证时间戳数据

de8ca1cef0be3ad671e6bc4ba814dce4.png

其中 orderDate 和 senderDate 变量为Beanshell定义好的,如果需要更多的时间偏移,可以定义更多的,可以实现提前N天和延后M天。

当前时间 &当前时间 - 1天 & 当前时间+365天

df24165acbfed10ebbda514e9b40b867.png
  • 高级篇·时间戳的计算

获取一小时之前的时间戳:

显示秒级别:    ${__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:

bfc2d1baf1803c9537ea5ffb6a79480c.png

应用场景2:

随机延长或缩短不同时间,制造不同时间点数据,便于实现并发。

3a7a04d107a4f58ce5d8d1f514b342ae.png

955e22e70ab11df352a6fc3c56ab3dcd.png

当前时间: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,)}


综上所述,基于常用的时间戳使用函数基本可以覆盖当前大部分的使用场景,其中有一部分是在网上收集整理,并非原创,旨在方便大家使用,如有侵权请联系删除!


美丽人生:服务搭建篇·Jenkins+Jmeter+Gitlab持续集成实现接口流程自动化·讲在服务搭建之前​zhuanlan.zhihu.com

转载地址:http://oguhp.baihongyu.com/

你可能感兴趣的文章
phpstudy2018搭建网站,访问目录出现Forbidden You don't have permission to access / on this server...
查看>>
Visual Studio 2017再现C语言经典例题(一)
查看>>
HDU4045-第二类斯特林数
查看>>
Dagger2 入门解析
查看>>
JS——indexOf replace search
查看>>
关于android studio安装过程中的问题
查看>>
mysql 函数学习(常用) 及 用户管理
查看>>
sigmod函数求导
查看>>
Linux学习笔记--基础命令
查看>>
PHP+MySQL+Zend+phhMyAdmin教程
查看>>
记Tomcat进程stop卡住问题定位处理
查看>>
c++ 链接mysql:error LNK2019: 无法解析的外部符号
查看>>
js-面试题整理
查看>>
thinkphp命名空间
查看>>
数组课堂作业
查看>>
【POJ 1026】Cipher(置换群)
查看>>
职场有影帝出没,屌丝们请当心!
查看>>
Python中进程无法结束的处理办法
查看>>
[codevs1039]数的划分(noip)
查看>>
线程pthread_cleanup_push的简单例程.
查看>>