Mi sono imbattuto in un test unitario che si interrompe a intermittenza perché il tempo trascorso non è quello che mi aspetto che sia.Quanto è accurato Thread.Sleep (TimeSpan)?
Un esempio di ciò che questo test si presenta come è:
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);
Il più delle volte questo passa, ma non è riuscita almeno in un'occasione riuscita perché:
previsto: maggiore o uguale a 2999 ma era: 2998
Non capisco come potrebbe essere inferiore a 3 secondi. Esiste un problema di accuratezza con Thread.Sleep o forse Cronometro di cui non sono a conoscenza?
Proprio come un aggiornamento ad alcune delle domande seguenti. Lo scenario che viene testato unitariamente è una classe che consente di chiamare un metodo per eseguire qualche azione e, se fallisce, aspetta un secondo e richiama quel metodo. Il test mostrato sopra è solo un'approssimazione di ciò che sta accadendo.
Dire che volevo chiamare un metodo DoSomething() ... ma nel caso di un'eccezione lanciata da DoSomething() voglio poter riprovare a chiamarlo fino a un massimo di 3 volte ma attendere 1 secondo tra ogni tentativo. Lo scopo del test unitario, in questo caso, è verificare che quando abbiamo richiesto 3 tentativi con 1 secondo di attesa tra ogni tentativo, il tempo totale impiegato è maggiore di 3 secondi.
Solo per curiosità, perché si dispone di un test dell'unità che testa Thread.Sleep() in questo modo? Immagino che in realtà stai testando per vedere se qualche altra attività si completa in meno di 3 secondi, ma perché non chiamare semplicemente Thread.Sleep (3000)? – MusiGenesis
@MusiGenesis Ho aggiornato la domanda per cercare di chiarire un po 'le cose. – mezoid
Solo per informazioni. Da quando ho scoperto questo piccolo codice, lo uso ovunque: http://www.codeproject.com/KB/cs/highperformancetimercshar.aspx – sabiland