Con Sleep (n), due regressioni posso immaginare che un test sia utile da catturare sono:
- Mancato richiamo della piattaforma sottostante in modalità sleep con conseguente n
il sonno si verifica affatto
- Le unità di ritardo vengono tradotte in modo errato (ad esempio 100 secondi anziché 100 millisecondi).
Se il rischio che si verifichi un tale regresso vale la pena di scrivere test dipende dal giudizio.
I test come questi sono sensibili al timing e passano o falliscono a causa della velocità attuale dell'ambiente su cui sono in esecuzione. Per renderli affidabili, sei costretto ad aumentare i ritardi. Ad esempio, testare Sleep (10) per assicurarsi che non sia realmente Sleep (0) o Sleep (10000) non può essere fatto in modo affidabile testando che il ritardo sia tra 10ms e 20ms. se l'ambiente è lento, tale test è suscettibile di passare anche se il bug n. 1 esiste (falso positivo) e fallisce anche se non è presente alcun bug (falso negativo).
I test unitari dovrebbero essere affidabili e ripetibili su qualsiasi macchina, specialmente su macchine sviluppatrici.
L'unico modo per rafforzare l'affidabilità del test è quello di spingere i ritardi testati molto al di sopra della velocità tipica più bassa dell'ambiente. Ad esempio, verificare che Sleep (5000) causi un ritardo tra 5000 ms e 6000 ms. Ma ora i test sono lenti da eseguire.
I test unitari dovrebbero essere veloci, in modo che gli sviluppatori non siano scoraggiati dal farli spesso.
Potrebbe essere possibile trovare un saldo in modo che i test siano ragionevolmente veloci e affidabili, ma con scansioni casuali di antivirus, aggiornamenti, specifiche e chissà su cos'altro succederà sui computer degli sviluppatori potrebbe essere più facile non includerli come test unitari, ma fateli funzionare come una suite separata.
Questo argomento tocca anche i componenti multi-thread test. Puoi scrivere il componente in modo tale da renderlo controllabile sotto test, ma io tendo a non gradirlo perché tende a rendere il design più complesso solo per i test che violano il principio del bacio. Spesso esiste un modo più semplice per testare un componente multi-thread, ma per garantire l'affidabilità sono necessari grandi ritardi nei test. Questo metodo è spesso odiato perché tali test tendono ad essere inclusi nella suite di test unitari e improvvisamente gli sviluppatori scoprono che i test unitari ora richiedono più anni, a volte alcuni test falliscono casualmente, causando a qualcuno di "risolverli" i test ora richiedono ancora più tempo.
Ne parlo perché questi test potrebbero andare nella stessa suite a esecuzione lenta in esecuzione sull'ambiente controllato. Ed essere fatti su misura per girare in modo affidabile su una macchina di prova a loro dedicata che non aveva nient'altro da fare, forse lanciata da CI. Questa suite di test potrebbe anche includere altri tipi di test a bassa velocità che non sono necessariamente affidabili, come i test di randomizzazione che sono sottovalutati. Il tipo di test utili che vedo mancanti perché nessuno sa dove metterli.