51Testing软件测试论坛

标题: RobotFramework之DateTime [打印本页]

作者: MilgGtery    时间: 2019-2-12 15:57
标题: RobotFramework之DateTime
背景

继续学习RobotFramework框架,这次看的是DateTime库。

DateTime库是RobotFramework操作时间的一个库,可以进行很多时间方面的操作。


Get Current Date

示例代码

  1. *** Settings ***
  2. Library     DateTime

  3. *** Test Cases ***
  4. test1
  5.     ${tm}       get_current_date
  6.     log     ${tm
复制代码

执行结果

  1. 11:08:49.158    INFO    2017-05-01 11:08:49.157
复制代码

源代码

  1. def get_current_date(time_zone='local', increment=0,
  2.                      result_format='timestamp', exclude_millis=False):
  3.     if time_zone.upper() == 'LOCAL':
  4.         dt = datetime.now()
  5.     elif time_zone.upper() == 'UTC':
  6.         dt = datetime.utcnow()
  7.     else:
  8.         raise ValueError("Unsupported timezone '%s'." % time_zone)
  9.     date = Date(dt) + Time(increment)
  10.     return date.convert(result_format, millis=is_falsy(exclude_millis))
复制代码

说明

这个方法可以不传入参数,默认使用的是当地时间,如果第一个参数传入utc不区分大小写,则会使用utc时间。如果需要一个时间偏移量,则可以在第二个参数中传入时间偏移,传入的参数可以是一个数字或者str的数字,单位为秒,比如如下代码,执行的结果就会相差1分钟

  1. test1
  2.     ${tmdl}       get_current_date    local       60
  3.     ${tm}       get_current_date
  4.     log     ${tm}
  5.     log     ${tmdl}
  6.    
  7. Result

  8. KEYWORD BuiltIn . Log ${tm}
  9. Documentation:  
  10. Logs the given message with the given level.
  11. Start / End / Elapsed:  20170501 11:22:13.600 / 20170501 11:22:13.600 / 00:00:00.000
  12. 11:22:13.600    INFO    2017-05-01 11:22:13.600
  13. 00:00:00.001KEYWORD BuiltIn . Log ${tmdl}
  14. Documentation:  
  15. Logs the given message with the given level.
  16. Start / End / Elapsed:  20170501 11:22:13.600 / 20170501 11:22:13.601 / 00:00:00.001
  17. 11:22:13.601    INFO    2017-05-01 11:23:13.599
复制代码

当然,也可以传入一个timedelta,会通过如下代码解析成秒数进行处理。

  1. class Time(object):

  2.     def __init__(self, time):
  3.         self.seconds = float(self._convert_time_to_seconds(time))

  4.     def _convert_time_to_seconds(self, time):
  5.         if isinstance(time, timedelta):
  6.             # timedelta.total_seconds() is new in Python 2.7
  7.             return (time.days * 24 * 60 * 60 +
  8.                     time.seconds +
  9.                     time.microseconds / 1e6)
  10.         return timestr_to_secs(time, round_to=None)
复制代码

第三个参数为格式化参数,从代码中可以看到,默认传入的是timestamp,而这里的解析源代码如下

  1. def convert(self, format, millis=True):
  2.         dt = self.datetime
  3.         if not millis:
  4.             secs = 1 if dt.microsecond >= 5e5 else 0
  5.             dt = dt.replace(microsecond=0) + timedelta(seconds=secs)
  6.         if '%' in format:
  7.             return self._convert_to_custom_timestamp(dt, format)
  8.         format = format.lower()
  9.         if format == 'timestamp':
  10.             return self._convert_to_timestamp(dt, millis)
  11.         if format == 'datetime':
  12.             return dt
  13.         if format == 'epoch':
  14.             return self._convert_to_epoch(dt)
  15.         raise ValueError("Unknown format '%s'." % format)
复制代码

所以,可以传入timestamp、datetime、epoch或者是我们正常格式化时间的%Y%m%d

第四个参数传入的是布尔值,是否需要毫秒级的数据,默认是False,也就是有毫秒的,如果不需要的话,传入${true}即可


Convert Date

示例代码

  1. *** Settings ***
  2. Library     DateTime

  3. *** Test Cases ***
  4. test1
  5.     ${tm}       convert_date        20170501
  6.     log     ${tm}
复制代码

执行结果

  1. 11:58:27.558    INFO    2017-05-01 00:00:00.000
复制代码

源代码

  1. def convert_date(date, result_format='timestamp', exclude_millis=False,
  2.                  date_format=None):
  3.     return Date(date, date_format).convert(result_format,
  4.                                            millis=is_falsy(exclude_millis))
  5.                                           
  6. def convert(self, format, millis=True):
  7.         dt = self.datetime
  8.         if not millis:
  9.             secs = 1 if dt.microsecond >= 5e5 else 0
  10.             dt = dt.replace(microsecond=0) + timedelta(seconds=secs)
  11.         if '%' in format:
  12.             return self._convert_to_custom_timestamp(dt, format)
  13.         format = format.lower()
  14.         if format == 'timestamp':
  15.             return self._convert_to_timestamp(dt, millis)
  16.         if format == 'datetime':
  17.             return dt
  18.         if format == 'epoch':
  19.             return self._convert_to_epoch(dt)
  20.         raise ValueError("Unknown format '%s'." % format)
复制代码

说明

该方法就是一个时间格式转换的方法,在上一个方法Get Current Date中获取的结果如果需要其他格式,就可以用这个方法进行转换,参数传入与上一个方法一样。


Convert Time

示例代码

  1. *** Settings ***
  2. Library     DateTime

  3. *** Test Cases ***
  4. test1
  5.     ${tm}       convert_time    10      timedelta
  6.     log     ${tm}
复制代码

执行结果

  1. 12:06:08.990    INFO    0:00:10
复制代码

源代码

  1. def convert_time(time, result_format='number', exclude_millis=False):
  2.     return Time(time).convert(result_format, millis=is_falsy(exclude_millis))
  3.    
  4. class Time(object):

  5.     def __init__(self, time):
  6.         self.seconds = float(self._convert_time_to_seconds(time))
  7.    
  8.     def convert(self, format, millis=True):
  9.         try:
  10.             result_converter = getattr(self, '_convert_to_%s' % format.lower())
  11.         except AttributeError:
  12.             raise ValueError("Unknown format '%s'." % format)
  13.         seconds = self.seconds if millis else float(roundup(self.seconds))
  14.         return result_converter(seconds, millis)

  15.     def _convert_to_number(self, seconds, millis=True):
  16.         return seconds

  17.     def _convert_to_verbose(self, seconds, millis=True):
  18.         return secs_to_timestr(seconds)

  19.     def _convert_to_compact(self, seconds, millis=True):
  20.         return secs_to_timestr(seconds, compact=True)

  21.     def _convert_to_timer(self, seconds, millis=True):
  22.         return elapsed_time_to_string(seconds * 1000, include_millis=millis)

  23.     def _convert_to_timedelta(self, seconds, millis=True):
  24.         return timedelta(seconds=seconds)
复制代码

说明

第一个参数是必传的,会在初始化Time类的时候转换成秒。源代码中的convert用了一个反射的方法,所以默认调用的是_convert_to_number会直接把传入的第一个参数转换成秒,然后返回。我写的示例代码填的是timedelta,会转换成时间格式。


Subtract Date From Date

示例代码

  1. test
  2.     ${time}     Subtract Date From Date         2014-05-28 12:05:52     2014-05-28 12:05:10
  3.     log     ${time}
复制代码

执行结果

  1.   INFO    42.0
复制代码

源代码

  1. def subtract_date_from_date(date1, date2, result_format='number',
  2.                             exclude_millis=False, date1_format=None,
  3.                             date2_format=None):
  4.     time = Date(date1, date1_format) - Date(date2, date2_format)
  5.     return time.convert(result_format, millis=is_falsy(exclude_millis))
  6.    
  7. class Date(object):

  8.     def __init__(self, date, input_format=None):
  9.         self.seconds = self._convert_date_to_seconds(date, input_format)
  10.         
  11.     def _convert_date_to_seconds(self, date, input_format):
  12.         if is_string(date):
  13.             return self._string_to_epoch(date, input_format)
  14.         elif isinstance(date, datetime):
  15.             return self._mktime_with_millis(date)
  16.         elif is_number(date):
  17.             return float(date)
  18.         raise ValueError("Unsupported input '%s'." % date)
复制代码

说明

方法是获取两个日期之间的差值,最终结果单位是秒,从示例代码中可以看得出来。Date类会将传入的date1和date2转换成默认的格式,然后做一次减法。最后得到的日期结果,通过time.convert方法转成秒



作者: Miss_love    时间: 2020-12-31 09:54
支持分享




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2