为测试目的,将函数替换为time()或sleep()是否可行且安全?

时间:2016-02-01 22:54:15

标签: python-3.x

我必须创建并测试一些执行带时间戳的数据处理的库。为了实现它,我需要利用一些自己的压缩源并转移“虚拟”时间。对任何测试模块透明的最简单方法是使用我自己的实现简单地替换time.time()和time.sleep()(可能这两个就足够了)。但它安全,合理吗?

任何聪明的选择?

1 个答案:

答案 0 :(得分:2)

是的,我已经完成了,它基本上和你想象的一样简单。我创建了一个名为FakeTime的类,它响应__call__以提供当前时间,该时间是在属性中设置的。

然而,你可以做得更好。这种事情一直都在做;它被称为“嘲弄”。 This blog post嘲笑时钟,就像你想做的那样:

import unittest
from mock import *
from datetime import datetime, timedelta
import time

mock_time = Mock()
mock_time.return_value = time.mktime(datetime(2011, 6, 21).timetuple())

class TestCrawlerChecksDates(unittest.TestCase):
    @patch('time.time', mock_time)
    def test_mock_datetime_now(self):
        self.assertEqual(datetime(2011, 6, 21), datetime.now())

mock的{​​{1}}习惯了有点奇怪,但您可以将上述内容读作“在调用以下方法的过程中,将其引用交换为{{1}与@patch。“

模拟time.time:这取决于你想做什么。假设你只是想让它根本不睡觉:mock_time应该可以工作。