【发布时间】:2010-11-21 04:18:30
【问题描述】:
我遇到了一个间歇性失败的单元测试,因为经过的时间不是我所期望的。
此测试的示例如下:
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 秒。
【问题讨论】:
-
只是出于好奇,为什么你有一个以这种方式测试 Thread.Sleep() 的单元测试?我猜您实际上是在测试其他活动是否在 3 秒内完成,但为什么不直接调用 Thread.Sleep(3000)?
-
@MusiGenesis 我已经更新了这个问题,试图澄清一下。
-
仅供参考。自从我发现了这个小代码,我到处使用它:codeproject.com/KB/cs/highperformancetimercshar.aspx
标签: c# multithreading sleep stopwatch