在Python中测试对时间敏感的应用程序

问题描述:

我在Django中编写了一个拍卖系统。我想编写单元测试,但应用程序对时间很敏感(例如,广告客户收取的金额是他们的广告在网站上活跃的时间的函数)。测试这种类型的应用程序有什么好方法?在Python中测试对时间敏感的应用程序

这里是一个可能的解决方案:一个DateFactory class,其提供了一些方法,以产生在测试可预测日期和生产中的实时值。您对这种方法有任何想法,或者您在实践中尝试过其他方法吗?

在你提供的链接,笔者有点拒绝添加额外的参数,以你的方法进行单元测试着想的想法,但在某些情况下,我认为你可以证明这只是为你的业务逻辑的延伸。在我看来,这是一种控制反转的形式,可以使你的模型更灵活,甚至更具表现力。例如:

def is_expired(self, check_date=None): 
    _check_date = check_date or datetime.utcnow() 
    return self.create_date + timedelta(days=15) < _check_date 

本质上这可以让我的单元测试提供自己的日期/时间来验证我的逻辑。

中所引用的博客的说法似乎是这个渣土了API。但是,我遇到了生产使用情况,要求用替代值取代当前日期/时间。换句话说,控制方法的倒置最终成为我的应用程序的必要部分。

一般来说,我尽量使生产代码起飞日期对象作为输入(其中语义允许的话)。在许多测试情况下,您描述的DateFactory就是人们所做的。

在Python中你也可以逃脱改变静态模块方法直接Datetime.now或Time.now。您需要小心谨慎地在测试的拆解部分替换它们。当你不能(或者很尴尬)改变你正在测试的类时,这是特别有用的。

要做到这一点,你有

def setUp(self) 
     self.oldNow = Datetime.now 
     Datetime.now = self._fakenow 
     ... 

    def tearDown(self) 
     Datetime.now = self.oldNow 

我做最后的换人是否有该安装方法将失败丝毫的方法可行。

对于许多情况下,定制DateFactory使用更安全,特别是如果你不必担心忘记的人拆机部分。