He encontrado una prueba unitaria que está fallando intermitentemente porque el tiempo transcurrido no es el que espero.¿Cuán exacto es Thread.Sleep (TimeSpan)?
Un ejemplo de lo que esta prueba se ve como es:
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);
La mayoría de las veces esto pasa pero ha fracasado en al menos en una ocasión falló porque:
esperado: mayor o igual a 2999 Pero fue: 2998
No entiendo cómo podría ser menos de 3 segundos. ¿Hay algún problema de precisión con Thread.Sleep o quizás con Cronómetro que no conozco?
Al igual que una actualización de algunas de las preguntas a continuación. El escenario que se está probando por unidades es una clase que permite llamar a un método para realizar alguna acción y, si falla, esperar un segundo y recuperar ese método. La prueba que se muestra arriba es solo una aproximación de lo que está sucediendo.
Digamos que quería llamar a un método DoSomething() ... pero en el caso de que DoSomething() haga una excepción, puedo intentar volver a llamarlo hasta un máximo de 3 veces, pero esperar 1 segundo entre cada intento. El objetivo de la prueba unitaria, en este caso, es verificar que cuando solicitamos 3 intentos con 1 segundo de espera entre cada reintento, el tiempo total requerido es mayor a 3 segundos.
Sólo por curiosidad, ¿por qué tienes una prueba de unidad que pone a prueba Thread.Sleep() de esta forma? Supongo que en realidad estás probando para ver si alguna otra actividad se completa en menos de 3 segundos, pero ¿por qué no simplemente llamar a Thread.Sleep (3000)? – MusiGenesis
@MusiGenesis He actualizado la pregunta para intentar aclarar un poco las cosas. – mezoid
Solo por información. Desde que descubrí este pequeño código, lo uso en todas partes: http://www.codeproject.com/KB/cs/highperformancetimercshar.aspx – sabiland