我遇到了一个单元测试,该测试间歇性地失败了,因为经过的时间不是我期望的那样。
该测试的示例如下:
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秒。
您的线程正在与其他线程共享CPU时间。轮到您再次进入睡眠状态时,睡眠就会结束,内核会注意到睡眠时间已经过去,因此它不是那么准确。
CPU负载,进程优先级,并发线程数(甚至来自其他进程)也会对其产生影响。