我遇到了一个单元测试,该测试间歇性地失败了,因为经过的时间不是我期望的那样。
该测试的示例如下:
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时间。轮到您再次进入休眠状态时, sleep 会立即结束,并且内核会注意到 sleep 时间已经过去,因此它不是那么准确。
CPU负载,进程优先级,并发线程数(甚至来自其他进程)也会对其产生影响。
关于c# - Thread.Sleep(TimeSpan)有多准确?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1303667/