![](/img/trans.png)
[英]When testing time-dependent code in Python, how can I “speed up time” without skipping seconds?
[英]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())
这使您的重要代码在多次执行中保持一致。
你可以预见性地测试它。
如果它在生产中失败,则更容易重构问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.