Я столкнулся с модульным тестом, который периодически прерывается, потому что прошедшее время не соответствует ожидаемому.
Пример того, как выглядит этот тест:
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 или, возможно, секундомер, о котором я не знаю?
Так же, как обновление некоторых вопросов ниже. Сценарий, который подвергается модульному тестированию, - это класс, позволяющий вызывать метод для выполнения какого-либо действия, а в случае сбоя подождите секунду и вызовите этот метод. Тест, показанный выше, является лишь приблизительным примером того, что происходит.
Скажем, я хотел вызвать метод DoSomething () ... но в случае возникновения исключения с помощью DoSomething () я хочу иметь возможность повторить вызов не более 3 раз, но ждать 1 секунду между каждая попытка. Цель модульного теста, в данном случае, состоит в том, чтобы убедиться, что, когда мы запросили 3 повторных попытки с интервалом в 1 секунду между каждой повторной попыткой, общее время, которое требуется, превышает 3 секунды.