用Python测试对时间敏感的应用程序
我在Django写了一个拍卖系统。我想编写单元测试,但应用程序是时间敏感的(例如,广告商收取的费用取决于他们的广告在网站上活跃的时间长短)。测试这类应用程序的好方法是什么用Python测试对时间敏感的应用程序,python,django,unit-testing,datetime,Python,Django,Unit Testing,Datetime,我在Django写了一个拍卖系统。我想编写单元测试,但应用程序是时间敏感的(例如,广告商收取的费用取决于他们的广告在网站上活跃的时间长短)。测试这类应用程序的好方法是什么 这里有一个可能的解决方案:a,它提供了一些方法来生成测试中的可预测日期和生产中的实时值。您对这种方法有什么想法吗,或者您在实践中尝试过其他方法吗?在您提供的链接中,作者有点拒绝为了单元测试而向方法添加额外参数的想法,但在某些情况下,我认为您可以将此作为业务逻辑的扩展。在我看来,这是一种控制反转的形式,可以使您的模型更灵活,甚至
这里有一个可能的解决方案:a,它提供了一些方法来生成测试中的可预测日期和生产中的实时值。您对这种方法有什么想法吗,或者您在实践中尝试过其他方法吗?在您提供的链接中,作者有点拒绝为了单元测试而向方法添加额外参数的想法,但在某些情况下,我认为您可以将此作为业务逻辑的扩展。在我看来,这是一种控制反转的形式,可以使您的模型更灵活,甚至更具表现力。例如:
def is_expired(self, check_date=None):
_check_date = check_date or datetime.utcnow()
return self.create_date + timedelta(days=15) < _check_date
def已过期(self,check\u date=None):
_check\u date=check\u date或datetime.utcnow()
返回self.create\u date+timedelta(天数=15)<\u check\u 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更安全,尤其是当您担心人们忘记拆卸部分时