测试时间依赖的方法

时间:2016-10-02 21:04:11

标签: python unit-testing

我有一个方法,它采用日期时间并返回此日期时间所属的时间段,例如“昨天”或“一个月前”。

from datetime import datetime


def tell_time_ago(basetime):
    difference = datetime.now() - basetime

    days = difference.days
    seconds = difference.seconds
    hours = seconds / 3600
    minutes = seconds / 60

    if days and days == 1:
        return 'Yesterday'
    elif days and days != 1 and days < 7:
        return '%s days ago' % days
    elif days and days != 1 and 7 < days < 31:
        return 'Within this month'
    elif days and days != 1 and 30 < days < 365:
        return '%s months ago' % (days / 30)
    elif days and days != 1 and 365 <= days < 730:
        return 'A year ago'
    elif days and days != 1 and days >= 730:
        return '%s years ago' % (days / 365)

    elif hours and hours == 1:
        return 'An hour ago'
    elif hours and hours != 1:
        return '%s hours ago' % hours

    elif minutes and minutes == 1:
        return 'A minute ago'
    elif minutes and minutes != 1:
        return '%s minutes ago' % minutes

    elif seconds and seconds == 1:
        return 'A second ago'
    elif seconds and seconds != 1:
        return '%s seconds ago' % seconds

    else:
        return '0 second ago'

我想扩展这个方法,所以我要为它编写测试。如果要为此方法编写测试,是否应该将系统的当前日期更改为特定日期并且每次都将其恢复为正常,因此测试不会因为日期更改而失败?例如:

class TestCase(unittest.TestCase):
    def test_timedelta(self):
        a_year_ago = datetime(2015, 5, 12, 23, 15, 15, 53000)
        assert tell_time_ago(a_year_ago) == 'A year ago'

如果我从现在起两年后进行此测试,它将会失败。什么是最好的方法?

1 个答案:

答案 0 :(得分:2)

一般来说,我认为尽可能使你的非平凡函数和类尽可能接近数学函数(例如sin(x))。给定相同的输入,数学函数每次都给出相同的输出,而不管当前日期,随机选择等等。

  • 如果您的函数根据当前日期或时间执行非平凡逻辑,请将当前日期或时间从外部传递给它。

  • 如果您的函数执行随机选择,请将其传递给伪随机数生成器。

因此,例如,而不是:

import datetime

def foo():
    ...
    now = datetime.datetime.now()
    ...

foo()

使用

import datetime

def foo(now):
    ...
    ...

foo(datetime.datetime.now())

这使得您的重要代码在多次执行中保持一致。

  1. 您可以预测地测试它。

  2. 如果在生产中失败,则更容易重建问题。