【问题标题】:How to write time dependent tests Python如何编写与时间相关的测试 Python
【发布时间】:2015-07-09 05:37:12
【问题描述】:

假设我有一个function:

def third_day_from_now():
    return datetime.date.today() + datetime.timedelta(days=3)

我想为此功能编写测试?我知道如果今天是25th,那么函数应该返回28。 有没有办法强制datetime 对象以25 的形式返回current date

【问题讨论】:

    标签: python unit-testing testing mocking


    【解决方案1】:

    freezegun 让模拟日期时间变得非常容易。

    from freezegun import freeze_time
    
    @freeze_time("2015-02-25")
    def test_third_day_from_now():
        assert third_day_from_now() == datetime.datetime(2015, 2, 28)
    

    【讨论】:

      【解决方案2】:

      更新函数以获取输入日期作为参数(默认值无)

      然后通过带参数调用测试函数,即自定义日期,不带参数。

      演示

      >>> def third_day_from_now(input_date=None):
      ...      if input_date:
      ...           return input_date + datetime.timedelta(days=3)
      ...      else:
      ...           return datetime.date.today() + datetime.timedelta(days=3)
      ... 
      
      >>> print "Today + 3:", third_day_from_now()
      Today + 3: 2015-07-12
      
      >>> input_date = datetime.datetime.strptime('25-05-2015', "%d-%m-%Y").date()
      >>> print "Custom Date:", input_date
      Custom Date: 2015-05-25
      >>> print "Custom Date + 3:", third_day_from_now(input_date)
      Custom Date + 3: 2015-05-28
      

      【讨论】:

        【解决方案3】:

        不,您不会尝试更改系统时钟,而是可以将功能更改为您可以测试的东西:

        def third_day_from(someday):
            """Returns the day three days after someday
            :param someday: a datetime to start counting from
            """
            return someday + datetime.timedelta(days=3)
        
        def test_third_day(...)
            today = datetime(25, 5, 2005)
            thirdday = datetime(28, 5, 2005)
            self.assertEqual(third_day_from(today), thirdday)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-03
          • 1970-01-01
          • 2020-05-28
          • 1970-01-01
          • 1970-01-01
          • 2010-09-08
          相关资源
          最近更新 更多