如何编写时间相关的测试Python

时间:2015-07-09 05:37:13

标签: python unit-testing testing mocking

假设我有function

def third_day_from_now():
    return datetime.date.today() + datetime.timedelta(days=3)

我想为此功能编写测试?我知道如果今天是25th,那么函数应该返回28。 有什么方法我可以强制datetime对象将current date作为25返回吗?

3 个答案:

答案 0 :(得分:3)

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)

答案 1 :(得分:1)

更新函数以获取输入日期作为参数(默认值为无)

然后通过参数调用测试函数,即自定义日期和不带参数。

<强>演示

>>> 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

答案 2 :(得分:0)

不,您不会尝试更改系统时钟,而是可以将功能更改为您可以测试的功能:

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)