超时单元测试

M. *_*ley 7 unit-testing timeout

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

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

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

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

mha*_*ler 10

我会尝试不同的方法.游戏开发者通常需要一种方法来控制游戏时间,例如快进功能或同步帧速率.它们引入了一个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();
}
Run Code Online (Sandbox Code Playgroud)


Pét*_*rök 4

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