我遇到了一个单元测试,它会间歇性地失败,因为经过的时间不是我预期的。
这个测试的例子如下:
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
TimeSpan oneSecond = new TimeSpan(0, 0, 1);
for(int i=0; i<3; i++)
{
Thread.Sleep(oneSecond);
}
stopwatch.Stop();
Assert.GreaterOrEqual(stopwatch.ElapsedMilliseconds, 2999);
大部分时间这都能通过测试,但至少有一次失败了,原因是:期望值:大于等于2999 实际值:2998
我不明白它怎么可能少于3秒。Thread.Sleep或者Stopwatch是否存在精度问题,还是我没有意识到什么呢?
更新一些在下面的问题。正在进行单元测试的场景是允许调用一个方法执行某个操作,如果失败等待一秒钟并重新调用该方法的类。上面展示的测试只是对正在发生的事情的近似描述。
假设我想调用DoSomething()方法...但是如果DoSomething()抛出异常,我想能够最多重试3次,但在每次尝试之间等待1秒钟。在这种情况下,这个单元测试的目的是验证当我们请求3次,在每次重试之间等待1秒钟时,所需总时间大于3秒。