繁体   English   中英

测试时间相关的方法

[英]Testing a time-dependent method

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

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'

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

总的来说,我认为让您的非平凡函数和类尽可能接近数学函数(例如sin(x) )是个好主意。 给定相同的输入,无论当前日期、随机选择等如何,数学函数每次都会给出相同的输出。

  • 如果您的函数执行依赖于当前日期或时间的重要逻辑,请将当前日期或时间从外部传递给它。

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

因此,例如,而不是:

import datetime

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

foo()

import datetime

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

foo(datetime.datetime.now())

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

  1. 你可以预见性地测试它。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM