経過時間が予想どおりではないため、断続的に失敗する単体テストに遭遇しました。
このテストの例は次のとおりです。
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);
ほとんどの場合、これは通過しますが、少なくとも1回は失敗しました。理由は、次のとおりです。
期待:2999以上しかしだった:2998
どうして3秒もかからないのかわかりません。Thread.SleepまたはおそらくStopwatchに、私が気付いていない精度の問題がありますか?
以下の質問のいくつかの更新と同じように。単体テストされているシナリオは、メソッドを呼び出して何らかのアクションを実行できるようにするクラスであり、失敗した場合は1秒待って、そのメソッドを呼び出します。上に示したテストは、起こっていることの単なる概算です。
DoSomething()メソッドを呼び出したいとしましょう...しかし、DoSomething()によって例外がスローされた場合、最大3回まで呼び出しを再試行できるようにしたいのですが、各試行の間に1秒待ちます。この場合の単体テストの目的は、3回の再試行を要求したときに、各再試行の間に1秒の待機があり、合計時間が3秒を超えていることを確認することです。