Domanda

Che tipo di tasso di esecuzione del fare è puntare con il test di unità (# test al secondo)?Quanto tempo è troppo lungo per una singola unità di test?

Sarei interessato a sapere se le persone hanno specifici soglie per determinare se le loro prove sono troppo lento, o è solo quando l'attrito di una lunga suite di test ha la meglio su di voi?

Infine, quando si decide il test è bisogno di correre più veloce, quali tecniche usare per velocizzare il test?

Nota:test di integrazione sono, ovviamente, un altro discorso ancora.Siamo rigorosamente parlando di unità di test che si desidera eseguire il più frequentemente possibile.


Risposta roundup: Grazie per le risposte finora.La maggior parte dei consigli sembra essere non preoccuparti per la velocità -- concentrarsi sulla qualità e solo in modo selettivo eseguire, se sono troppo lento.Risposte con numeri specifici sono inclusi puntando <10ms fino a 0,5 e 1 secondo al test, o semplicemente tenere l'intera suite di comunemente eseguire test sotto i 10 secondi.

Non sono sicuro se è giusto per segnare uno come un "accettato risposta" quando sono tutti utili :)

È stato utile?

Soluzione

Tutte le unità di test deve essere eseguito in meno di un secondo (che è a tutti gli unit test combinato deve essere eseguito in 1 secondo).Ora sono sicuro che questo ha limiti pratici, ma ho avuto un progetto con un 1000 test che esegue questo veloce su un computer portatile.Ti vuole veramente questa velocità, in modo che gli sviluppatori non temono il refactoring di un nucleo di parte del modello (cioè, Fatemi andare a prendere un caffè mentre faccio questi test...dopo 10 minuti torna).

Questo requisito anche le forze per progettare l'applicazione in modo corretto.Significa che il vostro modello di dominio è puro e contiene zero riferimenti a qualsiasi tipo di persistenza (I/O di File, Database, ecc).Gli Unit test sono tutti circa la prova di tali business relatonships.

Ora, questo non significa ignorare il test del database o la persistenza.Ma questi problemi sono ora isolato dietro archivi che possono essere separatamente testato con prove di integrazione che si trova in un progetto separato.Si esegue il test di unità costantemente durante la scrittura di codice di dominio e quindi eseguire il test di integrazione, una volta che il check-in.

Altri suggerimenti

Se stiamo parlando strettamente di unit test, mi piacerebbe puntare più per completezza di velocità.Se il tempo di esecuzione inizia a causare attrito, separare i test in diverse progetto/classi ecc.... e solo eseguire le analisi relative a ciò che si sta lavorando.Lasciate che il server di Integrazione eseguire tutti i test in arrivo.

L'obiettivo è 100s di test al secondo.Il modo in cui si arriva seguendo Michael Piuma regole di unit test.

Un punto importante che è venuto in un passato CITCON la discussione è che se i test non sono così veloce, è molto probabile che ti non stanno ottenendo i vantaggi di progettazione di test di unità.

Io tendono a concentrarsi di più sulla leggibilità dei miei test di velocità.Tuttavia, devo ancora provare a farli ragionevolmente veloce.Penso che se sono in esecuzione dell'ordine di millisecondi, si sta bene.Se si esegue un secondo o più per test...quindi si potrebbe fare qualcosa che dovrebbe essere ottimizzato.

Lento test solo di diventare un problema, in quanto il sistema di matura e provoca la generazione di durare ore e ore, al punto che è più probabile che si esegue in un problema di un sacco di tipi di lenti prove, piuttosto che uno o 2 test che è possibile ottimizzare facilmente...così probabilmente si dovrebbe prestare attenzione nel caso in cui si vede un sacco di prove con centinaia di millisecondi (o, peggio, secondi ciascuno), piuttosto che aspettare fino a che non ottiene le centinaia di prove che l'assunzione di long point (il punto in cui è molto difficile risolvere il problema).

Anche così, è solo ridurre il tempo che intercorre tra la tua generazione automatica di problemi di errori...che è ok, se è un'ora più tardi (o anche un paio di ore più tardi), penso.Il problema è in esecuzione prima del check-in, ma questo può essere evitato mediante la selezione di un sottoinsieme di esecuzione dei test che sono legate a ciò che si sta lavorando.Basta fare in modo di risolvere la build se il check-in codice che si rompe test non è stato eseguito!

Attualmente, siamo a 270 test in circa 3.qualcosa di secondi.Probabilmente ci sono circa 8 test di eseguire file IO.

Questi vengono eseguiti automaticamente in base ad una corretta compilazione delle nostre biblioteche in ogni ingegneri della macchina.Abbiamo più ampia (e tempo) di fumo-test che viene fatto da una macchina per la compilazione ogni notte, o può essere avviato manualmente su un ingegneri della macchina.

Come potete vedere non abbiamo ancora raggiunto il problema del test richiede troppo tempo.10 secondi per me è il punto in cui inizia a diventare invadente, quando si comincia ad avvicinarsi che sarà qualcosa che ti guarda.È probabile che abbassare il livello di librerie, che sono più robuste poiché essi cambiano di rado e sono poche dipendenze, nella nightly build, o una configurazione in cui sono eseguite solo con la macchina per la compilazione.

Se si richiede più di un paio di secondi per l'esecuzione di un centinaio di test potrebbe essere necessario esaminare ciò che si sta classificando come unità di prova e se non sarebbe meglio trattata come una prova del fumo.

il chilometraggio sarà ovviamente molto variabile a seconda della zona di sviluppo.

Dati Punto-Python Test Di Regressione

Ecco i numeri sul mio portatile per l'esecuzione di "test" per Python 2.5.2:

  • numero di prove:3851 (ca)
  • tempo di esecuzione:9 min 6 sec
  • tasso di esecuzione:7 prove / sec

Io giudico la mia unità di test per i test di base, non dal numero di test al secondo.Il tasso di puntare è 500ms o meno.Se si è al di sopra di che, mi aspetto il test per scoprire il motivo sta prendendo così tanto tempo.

Quando penso che un test è quello di rallentare, di solito significa che si sta facendo troppo.Pertanto, il refactoring del test di dividere il backup in più i test di solito fa il trucco.Le altre volte che ho notato che il mio test è in esecuzione lenta quando il test mostra un collo di bottiglia nel mio codice, quindi un refactoring del codice è in ordine.

C'è stato un buon articolo su questa dalla Potenza Di Due giochi, autori di UnitTest++.

Quanto tempo è troppo lungo per un singolo unità di test?

Direi che dipende dalla compilazione di velocità.Di solito si esegue il test in ogni compilazione.L'obiettivo di unit test non è quello di rallentare, ma per portare un messaggio "niente di rotto, vai su"(o "qualcosa si è rotto, STOP").

A me non da fastidio test la velocità di esecuzione fino a quando questo è qualcosa che inizia a diventare fastidioso.

Il pericolo è quello di interrompere l'esecuzione del test, in quanto sono troppo lento.

Infine, quando si decide il test bisogno di correre più veloce, le tecniche da fare si utilizza per velocizzare il test?

Prima cosa da fare è quello di riuscire a scoprire perché sono troppo lento, e se il problema è il test di unità o il codice sotto test ?

Mi piacerebbe provare a rompere la suite di test in diverse parti logiche, in esecuzione solo la parte che è presumibilmente interessato dal codice ho cambiato ad ogni compilazione.Io gestirei le altre suite meno spesso, forse una volta al giorno, o quando in dubbio, mi potrebbe essersi rotto qualcosa, e almeno prima di integrare.

Alcuni quadri di fornire l'esecuzione automatica di specifiche unità di test basati sull'euristica come ora di ultima modifica.Per Ruby e Rails, AutoTest fornisce molto più veloce e reattivo di esecuzione delle prove, quando salvo le Rotaie modello app/models/foo.rb, la corrispondente unità di test in test/unit/foo_test.rb ottenere l'esecuzione.

Non so se qualcosa di simile esiste anche per altre piattaforme, ma non avrebbe senso.

Una delle regole più importanti sull'unità di test è necessario eseguire veloce.

Quanto tempo è troppo lungo per una singola unità di test?

Gli sviluppatori dovrebbero essere in grado di eseguire l'intera suite di test di unità in pochi secondi, e sicuramente non in minuti e minuti.Gli sviluppatori dovrebbero essere in grado di eseguire rapidamente di loro dopo aver cambiato il codice in ogni caso.Se si prende troppo a lungo, ma non si preoccupa di eseguirli e si perde uno dei principali vantaggi di test.

Che tipo di tasso di esecuzione del fare è puntare con il test di unità (# test al secondo)?

Si dovrebbe puntare per ogni test eseguito in un ordine di millisecondi, nulla più di 1 secondo è probabilmente il test di troppo.

Attualmente abbiamo circa 800 test eseguiti in meno di 30 secondi, circa 27 test al secondo.Questo include il tempo per avviare l'emulatore necessari per la loro esecuzione.La maggior parte di loro ogni prendere 0-5ms (se ricordo bene).

Abbiamo uno o due che impiega circa 3 secondi, che sono probabilmente i candidati per il controllo, ma la cosa importante è tutta la suite di test non prendere così a lungo che mette fuori gli sviluppatori di esecuzione, e non rallentare in modo significativo la nostra integrazione continua a costruire.

Abbiamo anche un timeout configurabile limite impostato a 5 secondi, nulla di più tempo avrà esito negativo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top