Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 带超时的单元测试_Unit Testing_Timeout - Fatal编程技术网

Unit testing 带超时的单元测试

Unit testing 带超时的单元测试,unit-testing,timeout,Unit Testing,Timeout,我正在使用一个属性对一个类进行单元测试,该属性的值经常变化,这取决于它从另一个组件接收到的通信。如果该类在5秒钟内未收到任何通信,则该属性将恢复为默认值 我很容易对通信组件进行存根和模拟,以触发我想要测试的值。问题是,如果我在一台繁忙的机器上运行单元测试(如构建机器),并且有足够大的延迟导致属性默认,那么单元测试将失败 在模拟各种通信条件时,如何测试以确保此属性具有正确的值? 一个想法是重新构造代码,这样我就可以存根类中控制超时的部分。另一种方法是编写我的单元测试,这样它就可以检测是否由于超时而

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

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

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


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

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

在使用
DateTime.Now
时也存在类似的问题。 为了处理我喜欢的问题:

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

也许你可以在超时时使用同样的技巧?

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

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

伪代码:

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();
}

我选择走这条路是因为这是最简单的解决方案。其他建议也很好。谢谢大家!
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();
}