【问题标题】:How to write time dependent tests Python如何编写与时间相关的测试 Python
【发布时间】:2015-07-09 05:37:12
【问题描述】:
假设我有一个function:
def third_day_from_now():
return datetime.date.today() + datetime.timedelta(days=3)
我想为此功能编写测试?我知道如果今天是25th,那么函数应该返回28。
有没有办法强制datetime 对象以25 的形式返回current date?
【问题讨论】:
标签:
python
unit-testing
testing
mocking
【解决方案1】:
freezegun 让模拟日期时间变得非常容易。
from freezegun import freeze_time
@freeze_time("2015-02-25")
def test_third_day_from_now():
assert third_day_from_now() == datetime.datetime(2015, 2, 28)
【解决方案2】:
更新函数以获取输入日期作为参数(默认值无)
然后通过带参数调用测试函数,即自定义日期,不带参数。
演示
>>> def third_day_from_now(input_date=None):
... if input_date:
... return input_date + datetime.timedelta(days=3)
... else:
... return datetime.date.today() + datetime.timedelta(days=3)
...
>>> print "Today + 3:", third_day_from_now()
Today + 3: 2015-07-12
>>> input_date = datetime.datetime.strptime('25-05-2015', "%d-%m-%Y").date()
>>> print "Custom Date:", input_date
Custom Date: 2015-05-25
>>> print "Custom Date + 3:", third_day_from_now(input_date)
Custom Date + 3: 2015-05-28
【解决方案3】:
不,您不会尝试更改系统时钟,而是可以将功能更改为您可以测试的东西:
def third_day_from(someday):
"""Returns the day three days after someday
:param someday: a datetime to start counting from
"""
return someday + datetime.timedelta(days=3)
def test_third_day(...)
today = datetime(25, 5, 2005)
thirdday = datetime(28, 5, 2005)
self.assertEqual(third_day_from(today), thirdday)