我遇到了一个间歇性失败的单元测试,因为经过的时间不是我所期望的。
此测试的示例如下:
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 秒。