2008-08-15 16 views
18

Attualmente sto scrivendo una semplice mini app basata su timer in C# che esegue un'azione n volte ogni k secondi.
Sto cercando di adottare uno stile di sviluppo basato su test, quindi il mio obiettivo è testare tutte le parti dell'app.Unità testando un'applicazione basata su timer?

Quindi, la mia domanda è: c'è un buon modo per testare una classe basata su timer?

Il problema, come la vedo io, è che c'è un grosso rischio che i test avranno scomodamente tempo per l'esecuzione, in quanto devono aspettare tanto e così a lungo per le azioni desiderate per accadere.
Soprattutto se si vogliono dati realistici (secondi), invece di usare la minima risoluzione temporale consentita dal framework (1 ms?).
Sto utilizzando un oggetto fittizio per l'azione, per registrare il numero di volte in cui è stata richiamata l'azione e in modo che l'azione non prenda praticamente tempo.

risposta

9

Quello che ho fatto è di prendere in giro il timer, e anche l'ora del sistema corrente, che i miei eventi potrebbero essere attivati ​​immediatamente, ma per quanto riguarda il codice sotto test era trascorso il tempo.

3

Penso che quello che farei in questo caso è testare il codice che viene effettivamente eseguito quando il timer scandisce, piuttosto che l'intera sequenza. Quello che devi veramente decidere è se valga la pena testare il comportamento effettivo dell'applicazione (ad esempio, se ciò che accade dopo ogni tick cambia drasticamente da una spunta all'altra) o se è sufficiente (vale a dire , l'azione è la stessa ogni volta) per testare la tua logica.

Poiché il comportamento del timer è garantito non cambiare mai, funzionerà correttamente (ovvero, lo hai configurato correttamente) oppure no; sembra essere uno sforzo sprecato per includerlo nel test se non ne hai davvero bisogno.

+1

L'unico problema che vedo con il tuo approccio è che probabilmente dovrai esporre qualcosa che accade ogni volta che i sondaggi si verificano, è una buona idea? esporre qualcosa che non devi solo per i test. Un'alternativa potrebbe essere interna (e InternalsVisibleTo), ma a molte persone non piace neanche quella – roundcrisis

1

Sono d'accordo con Danny in quanto probabilmente ha senso da una prospettiva unitaria di test per dimenticare semplicemente il meccanismo del timer e solo verificare che l'azione stessa funzioni come previsto. Vorrei anche dire che non sono d'accordo nel senso che è uno sforzo inutile includere la configurazione del timer in una suite di test automatizzata di qualche tipo. Ci sono molti casi limite quando si tratta di lavorare con le applicazioni di temporizzazione ed è molto facile creare un falso senso di sicurezza testando solo le cose che sono facili da testare.

Si consiglia di disporre di una serie di test che eseguono il timer oltre all'azione reale. Probabilmente questa suite impiegherà un po 'di tempo per essere eseguita e probabilmente non sarà qualcosa che dovresti eseguire sempre sul tuo computer locale. Ma impostare questi tipi di cose su una build automatizzata notturna può davvero aiutare a sradicare i bug prima che diventino troppo difficili da trovare e risolvere.

Quindi, in breve, la mia risposta alla tua domanda è non preoccuparti di scrivere alcuni test che richiedono molto tempo per essere eseguiti. Test unitario su ciò che è possibile fare in modo che la suite di test funzioni velocemente e spesso, ma assicuratevi di integrarla con test di integrazione eseguiti meno frequentemente, ma che coprono più applicazioni e la sua configurazione.

Problemi correlati