与测试日期和时间相关的各种实用程序。

anybox.testing.datetime的Python项目详细描述


此包允许在测试中使用当前时间作弊。 它最初在odoo中用于测试跨越很长一段时间的工作流。

目前它主要提供一个datetime.set_now()方法来伪造 当前时间,和datetime.real_now()返回到原始时间 时间。

用法

在进行任何操作之前,必须导入包以替换 常规datetime模块,带有修改后的模块:

>>> import anybox.testing.datetime
>>> from datetime import datetime
>>> import time

让我们将now的实际值保持在:

>>> start = datetime.now()
>>> start_t = time.time()
>>> start_s = time.strftime('%Y-%m-%d')
>>> start_l = time.localtime()
>>> start_c = time.ctime()

然后您可以更改当前时间:

>>> datetime.set_now(datetime(2001, 01, 01, 3, 57, 0))
>>> datetime.now()
datetime(2001, 1, 1, 3, 57)
>>> datetime.today()
datetime(2001, 1, 1, 3, 57)

时间模块将继续:

>>> datetime.fromtimestamp(time.time())
datetime(2001, 1, 1, 3, 57)

请注意,可能会有几微秒的差异(未显示 因为datetime.fromtimestamp忽略了它们)。

时间模块中的其他一些功能也返回当前时间:

>>> time.localtime()
time.struct_time(tm_year=2001, tm_mon=1, tm_mday=1, tm_hour=3, tm_min=57, tm_sec=0, tm_wday=0, tm_yday=1, tm_isdst=-1)
>>> time.strftime('%Y-%m-%d')
'2001-01-01'
>>> time.ctime()
'Mon Jan  1 03:57:00 2001'
>>> time.asctime()
'Mon Jan  1 03:57:00 2001'
>>> time.gmtime()
time.struct_time(tm_year=2001, tm_mon=1, tm_mday=1, tm_hour=3, tm_min=57, tm_sec=0, tm_wday=0, tm_yday=1, tm_isdst=-1)

其余行为不会改变

>>> time.localtime(0).tm_year
1970
>>> time.strftime('%Y-%m-%d', datetime(1999,9,9).timetuple())
'1999-09-09'
>>> time.ctime(5)
'Thu Jan  1 02:00:05 1970'
>>> time.asctime(time.localtime(5))
'Thu Jan  1 02:00:05 1970'
>>> time.gmtime(5.0)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=5, tm_wday=3, tm_yday=1, tm_isdst=0)

之后不要忘记回到正常的系统时钟,否则 如果系统时钟看起来像 冰冻了:

>>> datetime.real_now()

现在让我们检查它是否有效:

>>> now = datetime.now()
>>> now > start
True
>>> from datetime import timedelta
>>> now - start < timedelta(0, 0, 10000) # 10 ms
True

使用time模块:

>>> now_t = time.time()
>>> now_t > start_t
True
>>> now_t - start_t < 0.01 # 10 ms again
True
>>> time.strftime('%Y-%m-%d') == start_s
True
>>> time.localtime().tm_mday == start_l.tm_mday
True

其他构造函数仍然可用(这是一个非回归 测试):

>>> import datetime
>>> datetime.time(3, 57, 0)
datetime.time(3, 57)
>>> datetime.datetime(2013, 1, 1, 3, 57, 0)
datetime(2013, 1, 1, 3, 57)
>>> datetime.date(2013, 1, 1)
datetime.date(2013, 1, 1)

发动机罩后面

我们的替换类是从datetime模块加载的, 但是原始datetime类的实例的行为与 我们的datetime.datetime的实例。这是必需的,因为 计算方法,实际返回原始对象 datetime类。这仅适用于python>;=2.6。

首先让我们检查我们的类是否是原始类的子类 一个。如果失败,则此测试不再意味着任何事情:

>>> datetime.datetime is datetime.original_datetime
False
>>> issubclass(datetime.datetime, datetime.original_datetime)
True

然后,让我们演示行为:

>>> odt = datetime.original_datetime(2012, 1, 1)
>>> isinstance(odt, datetime.datetime)
True
>>> issubclass(datetime.original_datetime, datetime.datetime)
True

从现在起我们需要一个tzinfo子类。

>>> from datetime import tzinfo
>>> class mytzinfo(tzinfo):
...     def utcoffset(self, dt):
...         return timedelta(hours=2)
...     def dst(self, dt):
...         return timedelta(0)

兼容性

在这个开发工具包模块的生命周期中,我们必须确保 与多个子系统的兼容性

记录

在日志模块中,time.localtime用作方法。我们只是检查它的工作情况

>>> import logging
>>> datetime.datetime.set_now(datetime.datetime(2000, 1, 1))
>>> logging.Formatter().converter().tm_year >= 2014
True
>>> datetime.datetime.real_now()

sqlite

另外,sqlite3确实将我们的datetimedate类识别为 如果它们是原始的:

>>> import sqlite3
>>> cnx = sqlite3.connect(':memory:')
>>> cr = cnx.cursor()
>>> cr = cr.execute("CREATE TABLE dates (dt text, d text)")
>>> dt = datetime.datetime(2013, 1, 25, 12, 34, 0)
>>> d = datetime.date(2013, 4, 7)
>>> cr = cr.execute("INSERT INTO dates VALUES (?, ?)", (dt, d))
>>> cr = cr.execute("SELECT dt, d from dates")
>>> cr.fetchall()
[(u'2013-01-25 12:34:00', u'2013-04-07')]

恢复原始时间

现在让我们用原来的版本再试一次:

>>> dt = datetime.datetime.now()
>>> isinstance(dt, datetime.original_datetime)
True
>>> d = datetime.date.today()
>>> cr = cr.execute("INSERT INTO dates VALUES (?, ?)", (dt, d))
>>> cr = cr.execute("SELECT dt, d from dates")
>>> res = cr.fetchall() # can't check the value, it changes a lot !

数据流aka pickle

模拟机支持酸洗:

>>> import pickle
>>> from StringIO import StringIO
>>> stream = StringIO()
>>> v = datetime.datetime(2013, 1, 1, 3, 57, 0)
>>> pickle.dump(v, stream)
>>> stream.seek(0)
>>> v2 = pickle.load(stream)
>>> v == v2
True
>>> type(v2)
<class 'anybox.testing.datetime.mock_dt.datetime'>
>>> stream = StringIO()
>>> v = datetime.datetime.now()
>>> pickle.dump(v, stream)
>>> stream.seek(0)
>>> v2 = pickle.load(stream)
>>> v == v2
True
>>> type(v2)
<class 'anybox.testing.datetime.mock_dt.datetime'>
>>> stream = StringIO()
>>> datetime.datetime.set_now(datetime.datetime(2001, 01, 01, 3, 57, 0))
>>> v = datetime.datetime.now()
>>> pickle.dump(v, stream)
>>> stream.seek(0)
>>> v2 = pickle.load(stream)
>>> v == v2
True
>>> type(v2)
<class 'anybox.testing.datetime.mock_dt.datetime'>

测试

这个自述也是一个博士。为了测试它和这个包的其他博士学位, 只需安装机头并运行:

$ nosetests

更改

0.5(2015-04-12)

  • 增加了对时间的支持。*函数
  • #6:修复了拾取错误

0.4.2(2013-06-11)

  • 文档中的一些改进

0.4.1(2013-04-24)

  • #3:修复了与sqlite3(通过ipython/ipdb发现)的兼容性问题

0.3.1(2012年11月28日)

  • #1:使用时区测试的代码可选参数now()不会中断 更多(但不支持实时时区)

0.3(2012-11-23)

  • 修正了datetime对象从 用于使isinstance测试失败的计算。

0.2.1(2012年11月22日)

  • 修复了datetime.timemasking的问题

0.1(2012-07-15)

  • 初始版本

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
我们可以使用java for loop with switch语句。。?   java如何从具有循环关系的数据集生成树?   使用s:mvcUrl标记时java Spring启动问题   javascript Wicket调色板水平滚动条在firefox中不显示   java如何清理Maven插件绑定?   java将文件从设备发送到计算机不起作用(文件被破坏)   Java GPU编程的性能   java字符串标记器问题   连接Java LDAP断开连接   java Android GridView将无法确定正确的位置   java AlarmManager在指定时间未显示toast消息   MVC中的java测试外观|断言返回类型   logcat上的java Android运行时错误   java Building Workspace在Eclipse中遇到错误   堆栈溢出尾部递归遗传算法抛出“awteventque0”java。StackOverflowerr语言   java ArrayOutOfBounds测试代码不工作   java有没有像Moodle这样流行的课程管理系统?   java如何从jsp获取xml文件作为响应