【问题标题】:Testing time sensitive applications in Python在 Python 中测试对时间敏感的应用程序
【发布时间】:2009-04-19 17:36:55
【问题描述】:

我用 Django 编写了一个拍卖系统。我想编写单元测试,但应用程序对时间敏感(例如,向广告商收取的费用是他们的广告在网站上活跃多长时间的函数)。测试此类应用程序的好方法是什么?

这是一种可能的解决方案:DateFactory class,它提供了一些方法来生成可预测的测试日期和生产中的实时值。您对这种方法有什么想法,或者您是否在实践中尝试过其他方法?

【问题讨论】:

    标签: python django unit-testing datetime


    【解决方案1】:

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

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

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

    引用的博客中的论点似乎是这搞砸了 API。但是,我遇到了 生产 用例要求用替代值替换当前日期/时间的情况。换句话说,控制反转方法最终成为我应用程序的必要部分。

    【讨论】:

      【解决方案2】:

      一般来说,我尝试让生产代码将日期对象作为输入(在语义允许的情况下)。在许多测试情况下,您所描述的 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 使用起来更安全,尤其是当您不得不担心人们忘记了 tearDown 部分时。

      【讨论】:

        猜你喜欢
        • 2017-01-02
        • 2011-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多