一、应用场景
接口测试中,有时候我们需要需要获取当前系统时间,比如当前是2020年12月24日。或者需要获取某个特定时间段的所有日期,比如当前一周内的所有日期,周一是2020年12月21日,周二是2020年12月22日...,周日是2020年12月27日。假如我们的接口测试工具使用的是Jmeter,我们需要Jmeter在调用接口发送请求的时候,能够提取到当前所需要的时间日期。
二、解决方案
1、使用Jmeter内置的两个时间函数来获取和处理时间
1.1 __time函数
__time函数可以返回指定格式的当前系统时间
调用格式:${__time(Format, variableName)}
参数说明:
(1)Format:时间格式。例如写成:y年-M月-d日,则返回:XXXX年-XX月-XX日。
(2)variableName:存放time函数返回结果值的变量名称,可选。例如写成:num。则${num}的值就是当前的系统时间。
1.2 __timeShift函数
和__time函数类似,区别是它可以返回按指定时间单位和时间数量偏移后的日期值。注:本函数在Jmeter3.3版本之后才有。
调用格式:${__timeShift(Format, DateToShift, valueToShift, LocaleToUseForFormat, variableName)}
参数说明:
(1)Format:时间格式。例如写成:y年-M月-d日,则返回:XXXX年-XX月-XX日。
(2)DateToShift 这里填写基于哪一个日期进行计算新的日期。类型为日期(时间)值,格式同Format参数匹配。如果不匹配、未提供该参数值,则默认使用当前日期。偏移是基于该日期(时间)的。参数可选
(3)valueToShift 指要偏移的秒数、分钟数、小时数、天数。参数可选
书写语法参考:https://docs.oracle.com/javase/8/docs/api/java/time/Duration.html#parse-java.lang.CharSequence-
(4)LocaleToUseForFormat 表示日期(时间)的语言环境,即用于格式化日期(时间)的语言. 语言代码必须小写。国家代码必须大写。分隔符必须为下划线。比如en_EN。参数可选,如果未提供,则模式使用ApacheJMeter 的locale.
书写语法参考: http://www.oracle.com/technetwork/java/javase/javase7locales-334809.html
(5)variableName 用于存放time函数返回结果值的变量名称,参数可选
2、结合java脚本,使用JMeter内置的两个时间函数来获取和处理时间
2.1 编写一个java脚本,获取本周内的周一日期和周日日期:
代码如下:
${__javaScript((new Date()).getFullYear()+'-'+ ((new Date()).getMonth()+1<10?"0"+((new Date()).getMonth()+1):((new Date()).getMonth()+1)) + '-' + (((new Date()).getDate()<10?"0"+(new Date()).getDate():(new Date()).getDate())-((new Date()).getDay()==0?7:(new Date()).getDay())+1),startMonday)};
${startMonday}; //本周开始时间,也就是周一
${__javaScript((new Date()).getFullYear()+'-'+ ((new Date()).getMonth()+1<10?"0"+((new Date()).getMonth()+1):((new Date()).getMonth()+1)) + '-' + (((new Date()).getDate()<10?"0"+(new Date()).getDate():(new Date()).getDate())+6-((new Date()).getDay()==0?7:(new Date()).getDay())+1),endSunday)};
${endSunday}; //本周结束时间,也就是周日
${__time(u,num)}; //今天是本周的第几天
2.2 在获取周一周日时间的基础上,对日期进行加减:
代码如下:
${startMonday}; //本周周一
${__timeShift(y-M-d,${startMonday},P1D,,week02)}; //本周周二
${__timeShift(y-M-d,${startMonday},P2D,,week03)}; //本周周三
${__timeShift(y-M-d,${startMonday},P3D,,week04)}; //本周周四
${__timeShift(y-M-d,${startMonday},P4D,,week05)}; //本周周五
${__timeShift(y-M-d,${startMonday},P5D,,week06)}; //本周周六
${__timeShift(y-M-d,${startMonday},P6D,,week07)}; //本周周日
${endSunday}; //本周周日
3、将时间处理的代码粘贴到beanshell取样器执行
4、其他请求取样器中引用时间变量
三、效果展示
四、总结归纳
如果只是简单获取当前系统时间,则使用time函数。
如果要获取当前一周内的每一天的日期,则需要结合java脚本和调用__timeShift函数