【问题标题】:Unit testing with timeouts带超时的单元测试
【发布时间】:2010-06-04 15:59:14
【问题描述】:

我正在对一个类进行单元测试,该类的值经常变化,具体取决于它从另一个组件接收到的通信。如果该类在 5 秒内未收到任何通信,则该属性将恢复为默认值。

为了触发我想要测试的值,我很容易存根和模拟通信组件​​。问题是,如果我在繁忙的机器(比如构建机器)上运行单元测试,并且有足够长的延迟导致属性默认,那么我的单元测试将失败。

在模拟各种通信条件时,您将如何测试以确保该属性具有正确的值?

一个想法是重构我的代码,以便我可以存根控制超时的类部分。另一个是编写我的单元测试,以便它可以检测它是否由于超时而失败并在测试结果中指出。

【问题讨论】:

    标签: unit-testing timeout


    【解决方案1】:

    我会尝试不同的方法。游戏开发者通常需要一种控制游戏时间的方法,例如用于快进功能或同步帧速率。他们引入了一个Timer 对象,该对象从硬件时钟或模拟时钟读取滴答声。

    在你的情况下,你可以为你的单元测试提供一个可控的计时器和一个在生产模式下委托给系统时间的计时器。这样,您可以控制测试用例的时间,从而控制被测类在特定超时条件下的反应。

    伪代码:

    public void testTimeout() throws Exception {
      MockTimerClock clock = new MockTimerClock();
    
      ClassUnderTest cut = new ClassUnderTest();
      cut.setTimerClock(clock);
      cut.beginWaitingForCommunication();
    
      assertTrue(cut.hasDefaultValues());
      cut.receiveOtherValues();
      assertFalse(cut.hasDefaultValues());
    
      clock.tick(5,TimeUnit.SECONDS);
      assertTrue(cut.hasDefaultValues());
      cut.shutdown();
    }
    

    【讨论】:

      【解决方案2】:

      您可以使 timeout 属性可配置,然后在您的单元测试中将其设置为足够高的值(或者足够低,如果您想对重置行为进行单元测试)。

      【讨论】:

      • 我选择了这条路线,因为它是适合我情况的最简单的解决方案。其他建议也很棒。谢谢大家!
      【解决方案3】:

      使用DateTime.Now时也有类似的问题。 Ayende described a trick处理我喜欢的:

      public static class SystemTime
      {
          public static Func<DateTime> Now = () => DateTime.Now;
      }
      

      然后在你的测试中:

      [Test]
      public void Should_calculate_length_of_stay_from_today_when_still_occupied()
      {
          var startDate = new DateTime(2008, 10, 1);
          SystemTime.Now = () => new DateTime(2008, 10, 5);
      
          var occupation = new Occupation { StartDate = startDate };
      
          occupation.LengthOfStay().ShouldEqual(4);
      }
      

      也许您可以使用相同的技巧来处理超时?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-05
        • 1970-01-01
        • 1970-01-01
        • 2021-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多